对各模式的测试代码位于example目录,其中又按模式功能分为三类:创建型模式CREATIONAL、结构型模式STRUCTURAL、行为型模式BEHAVIOURAL。其分布如下:
面向对象的精神是更好地应对需求的变化。面向对象技术的最新进展是设计模式。设计模式的目标可以概括为:可维护、可拓展、可复用、灵活性好。
-
一个类只负责一个功能领域中的相关职责,或可定义为:就一个类而言,应该只有一个引起它变化的原因。
-
用于控制类的粒度大小,是实现“高内聚、低耦合”的指导方针。
-
一个软件应对扩展开放,对修改封闭,即软件实体应尽量在不修改原有代码的情况下进行扩展。
-
用于组织独立的类,抽象化是实现该原则的关键,是重构和系统设计时的目标。
-
所有引用基类的地方必须能透明地使用其子类的对象。
-
在程序中尽量使用基类类型定义对象,在运行时再确定其子类类型,用子类对象替换父类。
-
是实现OCP的基础。
-
抽象不应该依赖于细节,细节应当依赖于抽象,即:要针对接口编程,而不是针对实现编程。
-
OCP主要实现机制之一,系统抽象化的具体实现。
-
在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即:使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。即:一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。
-
针对抽象层编程,将具体类的对象通过**依赖注入(Dependency Injection, DI)**的方式注入到其他对象中。
-
依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入和接口注入。构造注入是指通过构造函数来传入具体类的对象;设值注入是指通过Setter方法来传入具体类的对象;而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
-
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些不需要的接口。
-
接口有两种定义:
-
指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象。
可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口
-
指某种语言具体的(狭义的)“接口”定义,有严格的定义和结构。
接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。这里有可以表述为:“定制服务”机制,即为不同的客户端提供宽窄不同的接口.
-
-
注意控制接口的粒度.接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。
-
一个软件实体应尽可能少地与其他实体发生相互作用。
-
可以降低系统的耦合度,使类与类之间保持松散的耦合关系。
-
如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。
-
[1]在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;[2]在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;[3]在类的设计上,只要有可能,一个类型应当设计成不变类;[4]在对其他类的引用上,一个对象对其他对象的引用应当降到最低。