单例模式(Singleton)
策略模式(Strategy)
抽象策略角色:策略类,由接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。
代理模式(Proxy)
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:内部包含对真实对象的引用,从而可以操作真实对象。
代理对象提供与真实对象想同的接口以便在任何时刻都能代替真实对象。
代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装。
真是角色:代理角色所代表的真实对象,是最终要引用的对象。
观察者模式(Observer)
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
抽象主题角色: 把所有观察者对象的引用保留在一个集合中,每个抽象主题角色都可以有任意数量的观察者。
抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或者接口来实现。
抽象观察者角色:为所有具体的观察者定一个接口,在得到主题的通知时更新自己。
具体主题角色: 在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
如果需要具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现。
装饰模式(Decorator)
扩展对象的功能
在不创造更多子类的情况下,将对象功能加以扩展。
抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象。
具体构件角色:定一个将要接受附加责任的类。
装饰角色:持有一个构件的引用,并定义一个与抽象构件接口一致的接口。
具体装饰角色:负责给构件对象贴上附加责任。
模版方法模式(Template)
定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可以重新定义该算法的某些特定步骤。这里需要复用的是算法结构,也就是步骤,而步骤的实现可以在子类中完成。
使用场合
1)一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。
2)各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。首先识别现有代码的不同之处,并且把不同部分分离为新的操作,最后,用一个调用这些新的操作的模版方法来替换这些不同的代码。
3)控制子类的扩展。
组成
父类角色:提供模板
子类角色:为模版提供实现
适配器模式(Adapter)
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在心的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
组成
目标抽象角色(Target):定义客户要用的特定领域的接口
适配器(Adapter):调用另一个接口,作为一个转换器
适配器(Adaptee):定义一个接口,Adapter需要接入
客户端(Client):协同对象符合Adapter适配器
分类
基于类的继承方式
基于对象组合方式
缺省的适配器模式(AWT用到的方式)
命令模式(Command)
意图
将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;对请求进行排队或记录请求日志,以及支持可撤销的操作。
组成
客户角色:创建一个具体命令对象,并确定其接收者
命令角色:声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现。
具体命令角色:定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接受者的相应操作
请求者角色:负责调用命令对象执行请求。
接收者角色:负责具体实施和执行一个请求。
组合模式(Composite)
使在树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
组成
抽象构件接口(Component):
为组合的对象声明接口;
在某些情况下实现从此接口派生出的所有类共有的默认行为;
定一个接口可以访问及管理它的多个子部件;
叶部件(Leaf):
在组合中表示叶节点对象,叶节点没有子节点;
定义组合中接口对象的行为;
组合类(Composite):
定义有子节点(子部件)的部件的行为;
存储子节点(子部件);
在Component接口中实现与子部件相关的操作;
客户端(Client):
通过Component接口控制组合部件的对象。
实现方式
1)将管理子元素的方法定义在Composite类找那个
2)将管理子元素的方法定义在Component接口中,此时,Leaf类中对这些方法为空实现。
