1.策略模式
1.1定义和方法:
有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里,为不同的实现算法构造抽象接口,利用委托,运行时动态传入client倾向的算法类实例
1.2组成:
策略:策略是一个接口,该接口定义若干算法标识,即定义了若干个抽象方法。
上下文:上下文是依赖接口的类,即上下文中包含了策略变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。
具体策略:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法。
1.3示例:
策略:
上下文:
具体策略:
2.模板方法模式
2.1定义和方法:
做事情的步骤一样,但具体方法不同,共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现,使用继承和重写实现模板模式。
2.2组成:
AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现其它的抽象方法
ConcreteClass 实现抽象方法, 以完成算法中特定子类的具体业务步骤。
2.3示例:
抽象类:
实现抽象方法:
3.迭代器模式
3.1定义:
客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型,不管对象被放进哪里,都应该提供同样的遍历方式。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。迭代器模式把游走的任务放在迭代器上,简化了聚合的接口和实现。
3.2组成:
迭代器(Iterator):迭代器定义访问和遍历元素的接口。
具体迭代器(ConcreteIterator):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置。
聚合(Aggregate):聚合定义创建相应迭代器对象的接口。
具体聚合(ConcreteAggregate):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator 的一个适当的实例。
3.3示例:
迭代器;
具体迭代器:
聚合:
具体聚合:
4.观察者模式
4.1定义和方法:
对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类。为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码,可以在不改变ADT本身的情况下通过delegation接入ADT。
4.2组成:
Visitor(抽象访问者):抽象访问者为对象结构中每一个具体元素类ConcreteElement声明一个访问操作,从这个操作的名称或参数类型可以清楚知道需要访问的具体元素的类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。
ConcreteVisitor(具体访问者):具体访问者实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。
Element(抽象元素):抽象元素一般是抽象类或者接口,它定义一个accept()方法,该方法通常以一个抽象访问者作为参数。
ConcreteElement(具体元素):具体元素实现了accept()方法,在accept()方法中调用访问者的访问方法以便完成对一个元素的操作。
ObjectStructure(对象结构):对象结构是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法。它可以结合组合模式来实现,也可以是一个简单的集合对象。