设计模式杂记 - 基本概念
一 关系
依赖(Dependency)
依赖关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
A ------------> B
A依赖于B,A类中有B类型的局部变量、方法型参或者其他,但是没有B的成员变量或者属性。
关联(Association)
关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。关联关系一般使用成员变量来实现。
A -——————> B
A单项关联B,A类中有一个B的成员变量或者属性。
聚合(Aggregation)
聚合关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
汽车 ◇—————— > 引擎
组合(Composition)
组合关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。
公司 ◆——————————> 部门
*注
在代码层面关联、聚合、组合是一样的,但是语义上会有差别。
二 原则
-
开闭原则 (Open Closed Principle, OCP)
对模块 扩展开放, 对修改关闭。 .m里面的实现代码不改变(通过扩展子类来扩,修改或者扩展功能)
该原则是一个最理想状态。 -
里氏代换原则 (Liskov Substitution Principle , LSP)
任何类可以出现的地方, 子类一定可以出现, 子类跟父类可以相互替换,子类可以用父类所有的方法。该原则和接口隔离原则互斥。
和多肽的区别:多肽是重写父类的方法,而里氏替换原则则不能重现父类方法。 -
依赖倒转原则 (Dependency Inversion Principle, DIP)
抽象(接口)不依赖于细节(具体实现),细节依赖于抽象。(一般指的是接口)
再说白点,就是多用类似于 id<协议> 这种形式,而设计的时候也是要以这种形式而去设计。 -
接口隔离原则 (Interface Segregation Principle, ISP)
接口里面只做必要的事情 不做其他相关的事情。该原则和里氏代换原则互斥。 -
合成/聚合复用原则 (Composite/ Aggregate Reuse Principle, CARP)
需要从一个类扩展出另外一种方法,尽量不要使用继承(而是用聚合来扩展),使用新的方法。 -
最小知识原则 (Principle of Least Knowledge, PLK)
两个类没有彼此直接通信. 而是使用另一个类来通信。 -
单一职责原则 (Single responsibility principle, SRP)
一个类只负责一个功能领域。