沉寂了一个月的时间,仔细学习了下设计模式,从本篇博文开始陆续更新设计模式系列的文章,我给它起了个有意思的名字叫做:“围观”设计模式,当然围观是加引号的,我写博文分享的目的一方面是将自己学到的一些心得体会分享给大家,另一方面是博文与实际的案例结合,达到可以用于实际项目中的目的。希望看到博文的朋友多多提出宝贵的建议与批评,我会虚心的接受。

单一职责原则

单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。——维基百科

我们这里定义了这样的一个接口,包括setCarName,setCarColor,startUp,run和stop方法,那么这里应该很明显,所有的事情都要交给Car的实现类去完成,其中setCarName,setCarColor可以认为是完成了属性设置的任务,而后面的三个startUp、run、stop则完成了车的具体动作。从这里可以看出这个接口提供的方法存在职责不单一的问题,当然话说回来,setCarName和setCarColor如果放在一个接口中,那就职责单一了吗?一个设置名称,一个是设置颜色,也不是完全的单一嘛,我在这里的看法是不要斤斤计较,过分的划分功能,会导致设计的复杂化,加大工作量,所以在这里我觉得职责在划分的时候,需要进行一个抽象的过程,将完成的功能相近的划分到一起我觉得就可以了。

package cn.design.pattern2016032001SingleResponsibility;public interface Car {/** 设置名称 */public void setCarName(String carName);/** 设置颜色*/public void setCarColor(String carColoe);/** 启动*/public void startUp();/** 行驶*/public void run();/** 停止*/public void stop();}
package cn.design.pattern2016032001SingleResponsibility;public class CarImpl implements Car {@Overridepublic void setCarName(String carName) {System.out.println("名称:" + carName);}@Overridepublic void setCarColor(String carColoe) {System.out.println("颜色:" + carColoe);}@Overridepublic void startUp() {System.out.println("启动");}@Overridepublic void run() {System.out.println("行驶");}@Overridepublic void stop() {System.out.println("停止");}}
package cn.design.pattern2016032001SingleResponsibility;public class MainTest {public static void main(String[] args) {Car car = new CarImpl();car.setCarName("HongQi");car.setCarColor("Black");car.startUp();car.run();car.stop();}
}

那么我们应该怎么设计这个接口呢?

参考了《设计模式之禅》中的例子,将不同职责的操作分开到不同的接口中去。

package cn.design.pattern2016032002SingleResponsibility;public interface Car {/** 设置名称 */public void setCarName(String carName);/** 设置颜色*/public void setCarColor(String carColoe);
}
package cn.design.pattern2016032002SingleResponsibility;public interface CarAction {/** 启动*/public void startUp();/** 行驶*/public void run();/** 停止*/public void stop();
}
package cn.design.pattern2016032002SingleResponsibility;public interface CarOperate extends Car, CarAction{}
package cn.design.pattern2016032002SingleResponsibility;public class CarImpl implements CarOperate{@Overridepublic void setCarName(String carName) {System.out.println("名称:" + carName);}@Overridepublic void setCarColor(String carColoe) {System.out.println("颜色:" + carColoe);}@Overridepublic void startUp() {System.out.println("启动");}@Overridepublic void run() {System.out.println("行驶");}@Overridepublic void stop() {System.out.println("停止");}}
package cn.design.pattern2016032002SingleResponsibility;public class MainTest {public static void main(String[] args) {CarOperate car = new CarImpl();Car carSet = (Car) car;carSet.setCarName("HongQI");carSet.setCarColor("Black");CarAction carAction = (CarAction)car;carAction.startUp();carAction.run();carAction.stop();}
}

这些代码比较简单,我这里就不再过多的说明了。

我对这个问题有自己的看法,看下类图

这里会发生耦合,理论上应该尽量避免的,但是我觉得这样设计的话更能体现出单一职责原则。不过应该说尽量避免耦合才好,可能我的这种想法并不是推荐的方法。读者可以进行参考。

package cn.design.pattern2016032003SingleResponsibility;public interface Car {/** 设置名称 */public void setCarName(String carName);/** 名称 */public String getCarName();/** 设置颜色*/public void setCarColor(String carColoe);/** 颜色 */public String getCarColor();
}

public interface CarAction {/** 启动*/public void startUp();/** 行驶*/public void run();/** 停止*/public void stop();
}
package cn.design.pattern2016032003SingleResponsibility;public class CarImpl implements Car{private String carName;private String carColor;@Overridepublic void setCarName(String carName) {this.carName = carName;System.out.println("名称:" + carName);}@Overridepublic void setCarColor(String carColoe) {this.carColor = carColoe;System.out.println("颜色:" + carColoe);}@Overridepublic String getCarName() {return this.carName;}@Overridepublic String getCarColor() {return this.carColor;}}
package cn.design.pattern2016032003SingleResponsibility;public class CarActionImpl implements CarAction{private Car car;public CarActionImpl(Car car){this.car = car;}@Overridepublic void startUp() {System.out.println("启动>>" + car.getCarName());}@Overridepublic void run() {System.out.println("行驶");}@Overridepublic void stop() {System.out.println("停止>>" + car.getCarName());}
}
package cn.design.pattern2016032003SingleResponsibility;public class CarOperate {private Car car ;private CarAction carAction ;public CarOperate(Car car, CarAction carAction){this.car = car;this.carAction = carAction;}public Car getCar() {return car;}public CarAction getCarAction() {return carAction;}}
package cn.design.pattern2016032003SingleResponsibility;public class MainTest {public static void main(String[] args) {Car car = new CarImpl();CarAction carAction = new CarActionImpl(car);CarOperate carOper = new CarOperate(car, carAction);/*** 如果在Action中需要得到Car中的属性可以通过构造函数进行设置*/carOper.getCar().setCarColor("Black");carOper.getCar().setCarName("HongQI");carOper.getCarAction().startUp();carOper.getCarAction().stop();}
}

虽然这样的话体现单一设计模式比较好一些,但是还是感觉类之间的耦合有点强,不知道读者对这样的设计有什么看法呢?可以评论提出宝贵的建议。

单一职责模式的优点

1. 降低了单个类的复杂性,尽量保证一个类中操作的类型一致

2. 可读性较好,因为单一职责的原因,对某种职责的操作可以去具体的类中查看。

补充说明

单一职责原则,理论上我们要进行遵循的,但是往往实践中并不一定完全按照他的思路去设计,我的看法还是,尽量在完成业务需要的情况下,考虑按照单一职责原则对接口和类进行设计,类的设计过程中,不要过度的划分,适可而止就好。

源码已经上传至GitHub:下载设计模式代码

围观设计模式(1)--单一职责原则(SRP,Single Responsibility Principle)相关推荐

  1. 单一职责原则(Single Responsibility Principle,SRP)

    1 简介 定义 不要存在多于一个导致类变更的原因. 特点 一个类/接口/方法只负责一项职责. 优点 降低类的复杂度.提高类的可读性,提高系统的可维护性.降低变更引起的风险. 名字容易让人望文生义,大部 ...

  2. 【编码魔法师系列_六大原则1】单一职责原则(Single Responsibility Principle)

    学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题.设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性.可维护性和可重用性,从而让我们的开发效率更高.通 ...

  3. 1.单一职责原则(Single Responsibility Principle)

    1.定义 就一个类而言,应该仅有一个引起它变化的原因. 2.定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作. 3.优点 类的复杂 ...

  4. 单一职责原则 (Single Responsibility Principle,SRP)

    对一个类(或接口.方法)来说,应该只专注于做一件事,这样就能保证仅有一个引起它变化的原因. 转载于:https://www.cnblogs.com/finalstar/archive/2012/10/ ...

  5. 单一指责原则(Single Responsibility Principle) SRP

    using System; using System.Collections.Generic; using System.Text;namespace SingleResponsibilityPrin ...

  6. 设计模式(单一职责原则)

    一 . 单一职责原则(Single Responsibility Principle, SRP) 1.  一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原 ...

  7. 北风设计模式课程---单一职责原则

    北风设计模式课程---单一职责原则 一.总结 一句话总结: 视频教程网上一定能找到做好笔记的博客,很大几率都不需要自己做笔记.比如北风设计模式课程,https://www.cnblogs.com/xi ...

  8. [置顶]       设计模式之六大原则——单一职责原则(SRP)

    定义: 应该有且仅有一个原因引起类的变更. There should never be more than one reason for a class to change. 优点: 1.类的复杂性降 ...

  9. 单一职责原则(SRP)

    单一职责原则(Single Pesponsibility Principle, SRP) 单一职责有两个含义: 一个是避免相同的职责分散到不同的类中, 别一个是避免一个类承担太多职责 为什么要遵守SR ...

最新文章

  1. IDEA创建maven JavaWeb工程
  2. 航空购票系统源码java_航空售票系统 - WEB源码|JSP源码/Java|源代码 - 源码中国
  3. html网页动态显示效果,html的table用法(让网页的视觉效果显示出来)
  4. android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感
  5. 荣耀20 Pro三色渲染图曝光:后置潜望式镜头+3D ToF镜头
  6. mycat集群_HA高可用架构_验证高可用---MyCat分布式数据库集群架构工作笔记0030
  7. DLL初步和钩子入门
  8. SQL语句中 NOT IN 子句的“正确打开方式”
  9. MSDN中文帮助文档
  10. K8S---多节点部署---基于单节点(5)
  11. Windows列出系统所有补丁(wmic)
  12. 【UVa11584】划分成回文串
  13. 2022-2028全球与中国健康资讯交换(HIE)市场现状及未来发展趋势
  14. 王菲语法11 动词(非谓语动词)
  15. SQL注入攻击讲解及PHP防止SQL注入攻击的几种方法
  16. Zynq-Linux移植学习笔记之24-VPVN温度监测
  17. 前端动态生成横向树形表格
  18. 第三方登陆(二)QQ登陆
  19. 小小知识点(二十八)开环空间复用和闭环空间复用
  20. Java将图片转换成二进制,将二进制转换成图片

热门文章

  1. 【WUSTOJ 图论之基本算法:SPFA】 1013: 香甜的黄油
  2. 华为服务器rh2285v2重装系统,多应用可扩展 华为RH2285 V2服务器解析
  3. html5+div+字体缩放,调整字体大小以适合div(在一行上)
  4. Java使用Hutool工具完成加密解密
  5. 《天下3》弈剑键位设置
  6. 深击 | 运营商,只有“商”?
  7. 基于Canvas 六边形能力图(含动画)-干货满满~拿来就用!
  8. 小红书私信卡片android虚拟机实现代码
  9. layui弹窗点击确定后再执行下一步
  10. 超级计算机泰坦 amd,见证TOP500奇迹:详解超级计算机“泰坦”