委托、组合及几种设计模式


委派的使用:(类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

(0)
上一篇 2022年6月19日
下一篇 2022年6月19日

相关推荐

发表回复

登录后才能评论