面向复用的设计模式

1.    设计模式的分类:

    (1)Creational patterns(创建型模式)

            关注于对象的创建

    (2)Structural patterns(结构型模式)

            处理类和对象的组成。

            本文介绍Adapter,Decorator,Facade三种关于可复用的模式。

    (3)Behavioral patterns(行为类模式)

            描述类或对象交互与分担责任的方式。

            本文介绍Strategy,Template method,Iterator三种关于可复用的模式

2.    Structural patterns(结构型模式)

(1)Adapter    适配器模式。


        将某个类/接口转换为client期望的其他形式 。

        通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。 

        模型图:

        

        例如:

        

    但直接使用的话,会:

    

    因此需要一个适配器,将已有的函数完美适配成需要的函数:

    先建立一个接口,用于封装,再具体实现方法的适配,因此对抽象接口编程,与

    LegacyRectangle隔离。

    

另外一个例子:



(2)Decorator    装饰器模式。    

a.    应用条件:为对象增加不同侧面的特性

b.    解决方案:对每一个特性构造子类,通过委派机制增加到对象上 

比单一的继承更加灵活,可扩展。

即使用了subtyping,又使用了delegation


实例:为栈Stack增加不同属性:

a.    先实现一个抽象类:

    

    该抽象类相当于aggregation方式进行委派,其内部功能均通过委派到stack实现

b.    通过继承抽象类,实现stack接口,对其功能进行扩展:

    

基础功能通过父类抽象类中的委派实现,除此之外,增加了新特性用以修饰

使用方法:

a.    建立一个ArrayStack类,作为装饰的基础:

    

b.    要为stack增加 secure,synchronized,undo三重特性:

    

    即通过一层一层的装饰实现。

    可以灵活地进行

    Decorator vs. Inheritance:

    decorator在run time对特征进行组合

    -inheritance在compile time对特征进行组合

    decorator由多个合作的对象组成

    -inheritance产生一个单一的,类别清晰的对象

    decorator可以混合搭配多个修饰

    -inheritance很难多重继承


(3)Facade 外观模式:

a.    应用条件:客户端需要通过一个简化的接口来访问复杂系统内的功能 

b.    解决方式:提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用


应用实例:

两个Mysql和Oracle的Helper类:


分别封装了客户端所需要的功能,

要将两个helper类进行组合:发现两种DB:Mysql和Oracle,其下生成的Report:

PDF和HTML两种

因此使用外观模式封装这两种属性:

枚举类型:


再提供统一的接口:


进行简化。


3.    Behavioral patterns(行为类模式)

(1)Strategy 策略模式

应用条件:同一个任务存在不同的算法,客户端可以在runtimes时对不同算法进行动态的切换。

例子:Sorting(Bubble sort,mergesort,quicksort)

解决方案:为该算法algorithn创建一个接口,然后为每一种算法实现一个类。

优势:易扩展新的算法,可将算法从客户端代码中分离出来。


一个例子:

商场购物的两种方式:刷卡或支付宝paypal:


strategy接口:


实现1:


实现2:


客户端内一个方法:


充分利用了接口的通用性优势。

具体使用时:


这是一种黑盒框架的设计模式。


(2)Template 模板模式

应用场景:做事情的步骤一样,但具体方法不同

解决方案:共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。

使用继承和重写模式(而strategy pattern使用委派方式)


实例:OrderProcess:


ProcessOrder内为模板的执行步骤。


要对其步骤进行填充或修改:


只需要重写对应修改的步骤即可。

这是一种白盒框架的设计模式

(3)Iterator 迭代器模式

应用场景:用户需要统一的策略来获得一个容器内的所有元素,无论容器的种类

解决方法:使用本模式,用于迭代过程

使用结果:

a.    隐藏了内部container的基本实现

b.    通过使用统一的接口,支持多种遍历策略

c.    易于改变container的类型

d.    促进程序中各个部分的交互

模式结构:


a. Iterable接口:实现该借口的集合对象是可迭代遍历的


b.Iterator接口:迭代器:


设计思路,让自己的集合类实现Iterable接口,并实现自己独特Iterator迭代器(hasNext,next,remove),允许客户端利用这个迭代器进行显式或隐式的迭代遍历。




猜你喜欢

转载自blog.csdn.net/qq_38969070/article/details/80726639