《Java与模式》学习笔记:设计模式——原则 - shanchao的专栏 - CSDNBl...

来源:百度文库 编辑:神马文学网 时间:2024/04/28 10:25:24
《Java与模式》学习笔记:设计模式——原则
最近借了本阎博士的 Java与模式 开始学习设计模式。本人在设计模式方式纯属菜鸟,所以如果对某些模式的理解有偏差,还请大家及时指正。另外,本系列(《Java与模式》学习笔记)文章中许多语句都是来自原书,由于太多,基本没有注明出处,如果阎博士认为有侵权行为,也别来找我,我只是小角色。^_^
这些软件设计的基本原则是一种高度地抽象,如果说设计模式是软件设计中经验教训的总结,那么这些基本原则就是对设计模式的抽象,设计模式是实现这些原则的方式。所以这些原则才是重中之重,学设计模式重在学其“剑意”,而不是学其“剑招”。而这些原则就是“剑意”,学到深处,心中就只有“意”,而无“招”了。
一、“开-闭”原则(OCP)
1。定义:一个系统应该对扩展开发,对修改关闭。
2。详细解释:在设计一个模块的时候,应该使这个模块可以在不被修改的前提下被扩展。也就是不修改原有的代码,而扩展出一个新的功能。
3。自己的理解:开闭原则其实说的是对可变的部分进行封装,并给这个具体实现一个抽象的接口或父类,这样一来,当以后需要扩展新功能的时候,只需要增加一个新的类,继承或实现这个父类或接口。或者直接继承原来的具体实现。这样这个模块就可以在不修改原有代码的条件下,扩展新的功能了。
4。补充:
1)多态性污染:滥用多态,对于可变性不强的部分也增加大量的冗余代码增强其可扩展性。这样做是很没必要的,是一种为了模式而模式的做法。
2)具体类不是用来继承的:只要有可能,不要从具体类继承。
3)抽象类应该拥有尽可能多的共同代码,而应该拥有尽可能少的数据。(抽象类中的代码就算不使用,也不会占用内存空间,而变量不管是否使用都会占用内存)(创建一个子类对象时,JVM其实已经在子类对象中创建了一个父类的对象。)
4)使用继承的原则:
必须是is-a关系,也就是子类是超类的一个特殊种类,而不是超类的一个角色
永远不会出现需要将子类换成另一个类的子类的情况。
子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任(如果子类需要大良地置换掉超类的行为,那么这个子类就不应当成为一个超类的子类)
只有在分类学角度上有意义时,才可以使用继承,不要从工具类继承
二、里氏代换原则(LSP)
1。定义:如果一个方法可以接受一个父类对象作为参数,那么就一定可以接受这个父类的子类的对象。反过来的说法不成立。
2。自己的理解:这个原则已经被JAVA很好地支持了,我们只需要在程序中注意这个原则的使用就OK了。也就是要针对抽象编程,而不应该针对具体实现编程。
3。补充:
1)java语言对LSP的局限:JAVA编译器不能检查一个系统在实现和商业逻辑上是否满足里氏代换。最著名的例子是“正方形类是否是长方形类的子类”的问题。
2)墨子:白马,马也;乘白马,乘马也。骊马,马也;乘骊马,乘马也。(里氏转换)
娣,美人也;爱娣,非爱美人也。盗,人也;恶盗,非恶人也。
三、依赖倒转原则(DIP)
1。定义:要针对抽象编程,不应该针对具体实现编程。(DIP是OCP的实现方式)
2。补充:以来倒转原则假定所有的具体类都是会变化的,但是在实际中并不完全如此,有些类是十分稳定的,对于这样的类,就没必要过多地去模式了。
四、接口隔离原则(ISP)
1。定义:使用多个专用的接口比使用单一的总接口要好。应该让接口最小化,而不应该将不同角色的行为定义在一个接口中。
2。自己的理解:看人下菜碟
五、合成/聚合复用原则(CARP)
1。定义:应该尽量使用合成/聚合,而少使用继承
2。难点;设计时的is-a,has-a关系。这设计到OOD的思想。
六、迪米特法则(LoD)
1。定义:一个对象应当对其他对象有尽可能少的了解。
2。自己的理解:尽量减少对象间通信,隐藏具体实现,仅仅暴露有限的对外接口。
3。注意:
1)在类的划分上,应当创建有弱耦合的类。
2)在类的结构设计上,每个类都应该尽量降低成员的访问权限
3)一个类应当尽可能设计成不可变类
4)在对其他类的引用上,一个对象对其他对象引用应当降到最低
4。补充:
1)谨慎使用Serializable,原因:没看明白