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),允许客户端利用这个迭代器进行显式或隐式的迭代遍历。