适配器模式
把一个类的接口变换成客户端能够接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。
结构:
- Target(目标接口):所要转换的接口
- Adaptee(源角色):需要适配的接口
- Adapter(适配器):将源接口适配成目标接口,继承源接口,实现目标接口。
例:java I/O中的适配器模式
InputStreamReader、OutputStreamWriter分别继承Reader和Writer接口,但是创建两者的对象,必须要在构造方法中传入InputStream和OutputStream的实例。
以InputStreamReader为例,InputStreamReader作为适配器,实现了Reader接口,并且持有了InputStream的引用(通过StreamDecoder简介持有,因为byte到char需要经过编码)。
装饰器模式
赋予被装饰的类更多的功能,但是对于原来该类的使用者不应该感受到装饰前和装饰后有什么不同(即,实现被装饰类的所有功能,然后再原有的基础上赋予其更多的功能)
结构:
- Component:抽象组件角色,定义一组抽象的接口,规定这个被装饰组件都有哪些功能
- ConcreteComponent:实现这个抽象组件的所有功能
- Decorator:装饰器角色,它持有一个Component对象实例的引用,定义一个与抽象组件一致的接口
- ConcreteDecorator:具体的装饰器实现者,负责实现装饰器角色定义的功能
例:java I/O中的装饰器模式
以FilterInputStream为例,InputStream是一个抽象组件,FileInputStream是InputStream抽象组件的具体实现FilterInputStream作为修饰器,实现InputStream所有接口,并且持有InputStream引用,BufferedInputStream作为FilterInputStream具体实现,给InputStream附加了部分功能。
访问者模式
访问者模式设计的初衷是为了将稳定的数据结构和对数据结构变化多端的操作解耦,可以让操作者针对同一套数据结构自有的设计操作集合。
结构:
Client ----------------------- Visitor <-继承- ConcreteVisitor(具体的访问者,可以是多个)
| |(间接引用)
| |
ObjectStructure --<持有引用>-- Element <-继承- ConcreteElementX(具体节点元素,可以是多个)
- 抽象访问者(Visitor):声明所有访问者需要的接口
- 具体访问者(ConcreteVisitor):实现抽象访问者声明的接口
- 抽象节点元素(Element):提供一个接口,能够接受访问者作为参数传递给节点元素
- 具体节点元素(ConcreteElement):实现抽象节点元素声明的接口
- 结构对象(ObjectStructure):提供一个接口,能够访问到所有节点元素,一般作为一个集合特有节点元素的引用
- 客户端(Client):分别创建访问者和节点元素的对象,调用访问者访问变量节点元素
<访问者模式,待具体分析,及实例演示>