天天看点

软件设计七大原则之三--单一职责原则

单一职责原则

  • 定义:不要存在多于一个导致类变更的原因
  • 一个类/接口/方法只负责一项职责或职能

优点:

  1. 降低类的复杂度;
  2. 提高类的可读性,因为类的职能单一,看起来比较有目的性,显得简单;
  3. 提高系统的可维护性,降低变更程序引起的风险。

缺点:

如果一味追求这个单一职责,有时也会造成类的大爆炸。。。。。。。不过接口和方法应该遵循这个原则。

举个例子啦

1.创建一个Bird类和测试类MainTest

package com.maomao.design.principle.singleresponsibility;
public class Bird {
public void mainMoveMode(String birdName){
	System.out.println("用翅膀飞");
    }
}


package com.maomao.design.principle.singleresponsibility;
public class MainTest {
 public static void main(String[] args) {
	    Bird bird = new Bird();
        bird.mainMoveMode("猫头鹰");
      }
}
           

这样的结果运行如下:

用翅膀飞
           

2.当mainMoveMode方法中传入其它鸟类的时候,如驼鸟,说它用翅膀飞就不合适了,那么直接在Bird类中修改代码是最快的,但是,这样违反原则呀!而且风险也很大。

package com.maomao.design.principle.singleresponsibility;

public class Bird {

    public void mainMoveMode(String birdName){
        
        if(birdName.equals("驼鸟")){

            System.out.println("用脚走路");
        }
        
        else {
            
            System.out.println("用翅膀飞");
        }
    }
}
           

在MainTest中

package com.maomao.design.principle.singleresponsibility;

public class MainTest {

    public static void main(String[] args) {

        Bird bird = new Bird();

        bird.mainMoveMode("猫头鹰");

        bird.mainMoveMode("驼鸟");

    }

}
           

结果:

用翅膀飞
用脚走路
           
  1. 为了体现自己编码遵行一颗有原则的心,将代码进一步演进。分别创建两个类FlyBird和WalkBird 分别继承Bird
package com.maomao.design.principle.singleresponsibility;
 public class FlyBird  extends Bird{

    @Override
        public void mainMoveMode(String birdName) {
    
            System.out.println("用翅膀飞的鸟");
    
        }
    }

package com.maomao.design.principle.singleresponsibility;

public class WalkBird extends Bird {

    @Override
    public void mainMoveMode(String birdName) {

        System.out.println("用脚走路的鸟");

    }
}

public class MainTest {
public static void main(String[] args) {

FlyBird flyBird = new FlyBird();

flyBird.mainMoveMode("猫头鹰");

WalkBird walkBird = new WalkBird();

walkBird.mainMoveMode("驼鸟");
		 }
}
           

结果:

用翅膀飞的鸟
用脚走路的鸟
           

再举个例子

创建一个接口ICourse

package com.maomao.design.principle.singleresponsibility;

public interface ICourse {
	// 获取课程信息
    public String courseName();  // 获取Course的name的方法
    byte [] courseVideo();   // 获取视频流的方法
	
	//管理课程信息
    void studyCourse();    // 学习课程的方法
    void refundCourse();  // 退掉课程
    
}  ***因为退掉这种可能会影响到无法获取课程信息,所以可以将这个接口拆分成两个接口***

package com.maomao.design.principle.singleresponsibility;

public interface ICourseManager {

    void studyCourse();

    void refundCourse();

}

	package com.maomao.design.principle.singleresponsibility;
	public interface ICourseContent {
	
	public String courseName();
	byte [] courseVideo();
    
}

package com.maomao.design.principle.singleresponsibility;

public class CourseIml implements ICourseContent,ICourseManager {
    @Override
    public String courseName() {
        return null;
    }
@Override
public byte[] courseVideo() {
    return new byte[0];
}

@Override
public void studyCourse() {

}

@Override
public void refundCourse() {
 		}
}   这就是接口方面的单一职责
           

最后举一个方法的单一职责

public class Method {
    private void updateUserInfo(String userName,String address){
        userName = "maomao";
        address = "beijing";
    }

    private void updateUserInfo(String userName,String... properties){
        userName = "maomao";
//        address = "beijing";
    }

    private void updateUsername(String userName){
        userName = "maomao";
    }
    private void updateUserAddress(String address){
        address = "ShenZhen";
    }

    private void updateUserInfo(String userName,String address,boolean bool){
        if(bool){
            //todo something1
        }else{
            //todo something2
        }
		userName = "maomao";
        address = "ShenZhen";
    }


}