专栏
天翼云开发者社区

JAVA面向对象设计之单一职责原则

2022-12-21 16:19:48 336阅读

单一职责原则(类和方法,接口)

        单一职责原则指的是,引起一个类变化的因素不要多于一个。这里引起一个类变化的因素就是所谓的职责,当一个类符合遵循单一职责时,其成员应该是跟一个业务紧密相关的,只有当该业务需要扩展时才会引起对该类的修改。假如一个类T有两个职责P1和P2,当P1引起类T的修改时,可能导致职责P2相关业务的不正常,这就是职责P1和P2耦合在一起了,出于“高内聚,低耦合”的思想,职责P1和P2应该分别由两个类来负责,这也就是单一职责。同理,对于方法,也应该遵循单一职责原则。

代码示例

业务需求:现在有一个云数据库组件施工单部署的需求需要开发,业务要求是先进行预检查,然后进行施工单部署,最后不管成功与否都要上报施工结果。

第一版代码:

 public class ConstructService {
 ​
     /**
      * 施工单部署服务
      */
     public void deploy() {
         preCheck();
         System.out.println("施工部署");
         callback("施工结果");
    }
 ​
     /**
      * 环境预检查
      * 如果void修改为boolean
      */
     private void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     /**
      * 回调接口通知施工结果
      */
     private void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 ​
 }
 public class Client {
 ​
     public static void main(String[] args) {
         ConstructService constructService = new ConstructService();
         constructService.deploy();
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        从代码中我们看到,整个施工过程全部汇聚到deploy方法里面了,和preCheck和callback方法均有耦合,现在假设需求变动,要求必须预检查通过之后才能进行部署操作,不通过不部署,那么我们把preCheck的返回值修改为boolean,然后再去修改deploy方法,这意味着,preCheck方法和deploy方法是耦合在一起的,这不符合高内聚低耦合的思想,下面进行代码演进。

演进一:

 public class ConstructService {
 ​
     public void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     public void deploy() {
         System.out.println("施工部署");
    }
 ​
     public void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 ​
 }
 public class Client {
 ​
     public static void main(String[] args) {
         ConstructService constructService = new ConstructService();
         constructService.preCheck();
         constructService.deploy();
         constructService.callback("施工结果");
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        可以看到,我们把preCheck和callback方法全部开放为public,并保持deploy方法的独立性,然后由客户端去调用组装这些方法,初步实现方法级别遵循单一职责原则,这样子方法之间就解耦了。不过细心的朋友应该已经发现,回调方法放在施工服务里似乎不太妥当,假如现在有另一个注销服务也需要调用这个回调方法,那么注销服务就得依赖施工服务,这不仅无端造成耦合,还多出了很多冗余操作逻辑,确实不合理。基于高内聚的思想,我们把强相关的preCheck和deploy保留在施工服务里面,把弱相关的callback剥离出来,下面进行二次代码演进。

演进二:

 public class DeployService {
 ​
     public void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     public void deploy() {
         System.out.println("施工部署");
    }
 }
 public class NotifyService {
 ​
     public void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 }
 public class Client {
 ​
     public static void main(String[] args) {
         DeployService deployService = new DeployService();
         deployService.preCheck();
         deployService.deploy();
 ​
         NotifyService notifyService = new NotifyService();
         notifyService.callback("施工结果");
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        我们看到,多出了一个通知服务(NotifyService)专门用于做回调操作,从业务角度上来说,callback和通知服务属于强相关,遵循了高内聚的思想,即满足单一职责原则。至此,该段代码既实现了业务需求,又具备了可维护性和可扩展性。

  • 1
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
猩猩相惜

猩猩相惜

2 篇文章 0 粉丝
关注

JAVA面向对象设计之单一职责原则

2022-12-21 16:19:48 336阅读

单一职责原则(类和方法,接口)

        单一职责原则指的是,引起一个类变化的因素不要多于一个。这里引起一个类变化的因素就是所谓的职责,当一个类符合遵循单一职责时,其成员应该是跟一个业务紧密相关的,只有当该业务需要扩展时才会引起对该类的修改。假如一个类T有两个职责P1和P2,当P1引起类T的修改时,可能导致职责P2相关业务的不正常,这就是职责P1和P2耦合在一起了,出于“高内聚,低耦合”的思想,职责P1和P2应该分别由两个类来负责,这也就是单一职责。同理,对于方法,也应该遵循单一职责原则。

代码示例

业务需求:现在有一个云数据库组件施工单部署的需求需要开发,业务要求是先进行预检查,然后进行施工单部署,最后不管成功与否都要上报施工结果。

第一版代码:

 public class ConstructService {
 ​
     /**
      * 施工单部署服务
      */
     public void deploy() {
         preCheck();
         System.out.println("施工部署");
         callback("施工结果");
    }
 ​
     /**
      * 环境预检查
      * 如果void修改为boolean
      */
     private void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     /**
      * 回调接口通知施工结果
      */
     private void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 ​
 }
 public class Client {
 ​
     public static void main(String[] args) {
         ConstructService constructService = new ConstructService();
         constructService.deploy();
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        从代码中我们看到,整个施工过程全部汇聚到deploy方法里面了,和preCheck和callback方法均有耦合,现在假设需求变动,要求必须预检查通过之后才能进行部署操作,不通过不部署,那么我们把preCheck的返回值修改为boolean,然后再去修改deploy方法,这意味着,preCheck方法和deploy方法是耦合在一起的,这不符合高内聚低耦合的思想,下面进行代码演进。

演进一:

 public class ConstructService {
 ​
     public void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     public void deploy() {
         System.out.println("施工部署");
    }
 ​
     public void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 ​
 }
 public class Client {
 ​
     public static void main(String[] args) {
         ConstructService constructService = new ConstructService();
         constructService.preCheck();
         constructService.deploy();
         constructService.callback("施工结果");
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        可以看到,我们把preCheck和callback方法全部开放为public,并保持deploy方法的独立性,然后由客户端去调用组装这些方法,初步实现方法级别遵循单一职责原则,这样子方法之间就解耦了。不过细心的朋友应该已经发现,回调方法放在施工服务里似乎不太妥当,假如现在有另一个注销服务也需要调用这个回调方法,那么注销服务就得依赖施工服务,这不仅无端造成耦合,还多出了很多冗余操作逻辑,确实不合理。基于高内聚的思想,我们把强相关的preCheck和deploy保留在施工服务里面,把弱相关的callback剥离出来,下面进行二次代码演进。

演进二:

 public class DeployService {
 ​
     public void preCheck() {
         System.out.println("环境预检查");
    }
 ​
     public void deploy() {
         System.out.println("施工部署");
    }
 }
 public class NotifyService {
 ​
     public void callback(String msg) {
         System.out.println("回调通知" + msg);
    }
 }
 public class Client {
 ​
     public static void main(String[] args) {
         DeployService deployService = new DeployService();
         deployService.preCheck();
         deployService.deploy();
 ​
         NotifyService notifyService = new NotifyService();
         notifyService.callback("施工结果");
    }
 ​
 }

执行结果:

 环境预检查
 施工部署
 回调通知施工结果

        我们看到,多出了一个通知服务(NotifyService)专门用于做回调操作,从业务角度上来说,callback和通知服务属于强相关,遵循了高内聚的思想,即满足单一职责原则。至此,该段代码既实现了业务需求,又具备了可维护性和可扩展性。

文章来自专栏

设计模式

2 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 1
    点赞
  • 0
    收藏
  • 0
    评论