委派的使用:(类A的某些功能想要委托B来帮助进行)
绑定:类A通过某些方式和类B进行绑定,从而能访问类B的method和field
委托:通过绑定建立关系,类A的功能由B负责实现
委派和继承:继承是发生在Class层面的行为,委派是发生在Object层面的行为
CRP原则(复合性原则):类应该通过其组合(通过包含实现所需功能的其他类的实例)实现多态行为和代码重用,而不是从基类或父类继承、委托可以理解为发生在对象层面上,继承则发生在类层面上。
委派的种类:
Dependency(A use B):通过方法的参数或在方法的局部中使用
Association(A has B):永久性delegation,A实例化后具有了一个B的对象,delegation通过一个A的field表现出来
Composition/aggregation(A owns B):
Composition:更强的Association,A与B的delegation联系一旦建立就无法修改,关系通过初始化建立
Aggregation:更弱的Association,A与B的delegation联系在建立之后仍能修改关系通过方法、构造函数、方法传入参数建立。
通过委托进行设计:定义基本接口→通过接口进行继承,定义行为组合→设计具体类来实现之前用于描述行为组合的接口
黑盒框架是基于特定接口实现/委托,来进行的实现的:委托、接口
白盒框架是通过代码层面的复用进行实现的:继承、子类、重写与重载
模块化编程的特点:
高内聚:模块内部高内聚,即模块内部尽可能少地依赖于外部
低耦合:模块之间低耦合,即模块之间尽可能少地发生相互依赖
模块化降低整个系统复杂性的原因:
分离关注点:系统的开发针对每个模块进行
信息隐藏:每个模块很好地实现了自身的信息隐藏
模块化编程的5个评估模块:
可分解性:大的组件是否可分成许多小的组件
可组合性:一个大的组件是否由许多小的组件构成
可理解性:每个组件分离开是否仍易理解
可持续性:发生变化时受影响范围是否小
保护性:运行时一个组件发生异常是否对其它相关组件影响小
模块化设计的5条规则:
直接映射:模块结构与现实世界中问题领域的结构一致
少的接口:模块与其他模块的通讯应尽可能少
小的接口:两个模块之间的通讯应交换尽可能少的信息
显式接口:A与B的通讯应明显地发生在两者接口之间
信息隐藏:经常可能发生变化的设计决策尽可能隐藏在抽象接口后面
SOLID法则:
SRP(单一责任原则):一个类只有一个职责,引起这个类变化的原因只能有一个,如果这个类需要改变也是因为这一职责需要被改变才导致的
OCP(开放封闭原则):一个封闭的块,应做到对外扩展开放,对内修改封闭。扩展类功能的时候应该通过添加新的代码来实现而不是修改其代码
LSP(里氏替换原则):任何基类可以出现的时候,子类出现也能正常完成任务。更强的RI、更宽松的precondition、更强的postcondition、可见性相同或更强
DIP(依赖转置原则):类依赖时,只实现需要的接口;依赖最小的接口;避免胖接口
ISP(接口聚合原则):类依赖时,尽量依赖接口而非具体实现,无论是高层模块还是底层模块都应该依赖于抽象
设计模式:
Adapter:通过继承和委托来实现。
Decorator:通过迭代+委托实现。一个子类只负责一个效果,委托将效果累加到一个对象上
它有两个重要组成:Component和Decorator
Component是最根本的东西,所有的装饰都是因为想在Component上添加不同的东西才进行设计的
Decorator是一个抽象方法,它用于派生各种用来装饰Component的不同装饰器,每一个不同的装饰工作由不同的装饰器来完成,具体的装饰器只负责装饰(AddedBehavior),其它工作ConcreteComponent应该已经完成好了。
注意,在具体的装饰器中,在执行自己的装饰操作(AddedBehavior)之前,必须先调用父类的装饰操作(迭代)。
Strategy:通过委托实现。通过对于Context的某个方法,希望以不同的方式实现,但如果把实现逻辑写死在Context中,则更改不便,因此选择方法中传入一个代表策略(Strategy)的接口,通过在不同ConcreteStrategy中重写方法,可以根据需要,通过传入不同对象选择策略,同时实现代码的分离。
Template:通过继承和重写实现。
Factory method:
根据传入参数决定使用哪个构造方法:方法返回一个对象
根据子类类型决定使用哪个构造方法(每增加一个子类都需要重写工厂方法):工厂方法只为构建某个具体的对象实例
Visitor:通过双向委托实现。被查看的对象有许多种,发起查看的对象有许多种。被查看对象的accept函数需要接受visitor;发起查看的对象需要基于被查看对象进行。
基本逻辑:通过Visitor,实现不同对象的发起查看的方法;通过Element,允许不同的对象对自己进行不同的查看,查看方法和接受到的visitor密切相关。
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/267786.html