【设计模式】——六大原则
2015-12-13 18:30
218 查看
单一职责原则(SRP,Single Responsibility Principle)
定义:对一个类而言,应该仅有一个引起它变化的原因。
例子:手机可以有很多功能,但是基本上很多功能都不是最强大的,照相机的清晰度比手机相机高,摄影机的准确度比手机的录像功能强大,电视机看电视的画面感比手机强等等。其实也就是分工明确后的效率更高更好。
优点:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多。
提高类的可读性,提高系统的可维护性。
降低变更引起的风险。
开放—封闭原则(OCP,Open Closed Principle)
定义:软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。
例子:一国两制的创造是最好的例子,大陆的社会主义制度不可更改,香港澳门的资本主义制度不可更改,那就一个国家两种制度。在设计模式中,基本内容不可更改,但可以扩展的思想来增加功能。
内容:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
仅对程序中呈现出频繁变化的那些部分做出抽象隔离变化。
依赖倒转原则(DIP,Dependence Inversion Principle)
定义:高层模块不应该依赖低层模块,两个都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。
解释:抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是可以加上一个关键字new产生一个对象。
要求对抽象进行编程,不要对实现进行编程,也就是针对接口的编程,而不是针对过程的编程,这样就降低了客户与实现模块间的耦合。
里氏代换原则(LSP,Liskov Substitution Principle)
定义:子类型必须能够替换掉他们的父类型。
例子:猫吃鱼,狗吃肉,老鼠的儿子会打洞。
解释:只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才可以被复用,而子类也能够在父类的基础上增加新的行为。
迪米特法则(LoD,Law of Demeter)
定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的互相作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。一个对象应当对其他对象有尽可能少的了解,不和陌生人说话,简言之,低耦合。
解释:在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是private包装好,需要公开的字段,用属性来体现。
接口隔离原则(ISP,Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
解释:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,虽然他们都存在着用不到的方法,但由于实现了接口I,所以也必须要实现这些用不到的方法。
合成/聚合复用原则(CARR)
定义:尽量使用合成/聚合,尽量不要使用类继承。
优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
现在先写这些,以后再补充吧。
定义:对一个类而言,应该仅有一个引起它变化的原因。
例子:手机可以有很多功能,但是基本上很多功能都不是最强大的,照相机的清晰度比手机相机高,摄影机的准确度比手机的录像功能强大,电视机看电视的画面感比手机强等等。其实也就是分工明确后的效率更高更好。
优点:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多。
提高类的可读性,提高系统的可维护性。
降低变更引起的风险。
开放—封闭原则(OCP,Open Closed Principle)
定义:软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。
例子:一国两制的创造是最好的例子,大陆的社会主义制度不可更改,香港澳门的资本主义制度不可更改,那就一个国家两种制度。在设计模式中,基本内容不可更改,但可以扩展的思想来增加功能。
内容:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
仅对程序中呈现出频繁变化的那些部分做出抽象隔离变化。
依赖倒转原则(DIP,Dependence Inversion Principle)
定义:高层模块不应该依赖低层模块,两个都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。
解释:抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是可以加上一个关键字new产生一个对象。
要求对抽象进行编程,不要对实现进行编程,也就是针对接口的编程,而不是针对过程的编程,这样就降低了客户与实现模块间的耦合。
里氏代换原则(LSP,Liskov Substitution Principle)
定义:子类型必须能够替换掉他们的父类型。
例子:猫吃鱼,狗吃肉,老鼠的儿子会打洞。
解释:只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才可以被复用,而子类也能够在父类的基础上增加新的行为。
迪米特法则(LoD,Law of Demeter)
定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的互相作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。一个对象应当对其他对象有尽可能少的了解,不和陌生人说话,简言之,低耦合。
解释:在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是private包装好,需要公开的字段,用属性来体现。
接口隔离原则(ISP,Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
解释:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,虽然他们都存在着用不到的方法,但由于实现了接口I,所以也必须要实现这些用不到的方法。
合成/聚合复用原则(CARR)
定义:尽量使用合成/聚合,尽量不要使用类继承。
优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
现在先写这些,以后再补充吧。
相关文章推荐
- label文字太多导致与控件换行的问题
- 【LeetCode】283 Move Zeroes
- 设计模式之工厂家族
- net.sf.json在处理json对象转换为普通java实体对象时的问题和解决方案
- 【LeetCode】278 First Bad Version
- JSP精简见解
- 使用jQuery播放/暂停 HTML5视频
- 大型web系统数据缓存设计
- 显示意图激活另外一个Activity
- onetoone
- Android在onInterceptTouchEvent与onTouchEvent
- jquery特效(7)—弹出遮罩层且内容居中
- BZOJ 3224 普通平衡树
- 【HBOI2013】Ede的新背包问题
- WinExec 使用手记
- Spring MVC Controller单例陷阱
- 【C#】——out和ref区别
- JAVA泛型学习笔记
- securecrt同时向多个tab窗口发送相同的命令
- 《spring in action》笔记(一)