设计模式ppt
返回目录
7.10.1 策略模式的由来
class Point { public: Point(int x,int y){this->x = x;this->y = y;}; private: int x; int y; }; class PointArray { public: PointArray(); virtual void Sort(); virtual void SetChoice(const char); protected: virtual void SortA(); virtual void SortB(); virtual void SortC(); private: Array<Point,Point> pointlist; char choice; }; PointArray::PointArray() { choice = 'A'; } void PointArray::Sort() { if(choice == 'A') SortA(); else if(choice == 'B') SortB(); else if(choice == 'C') SortC(); } void PointArray::SetChoice(const char ch) { choice = ch; } void PointArray::SortA() { //依据每个Point对象的x值大小排序 } void PointArray::SortB() { //依据每个Point对象的y值大小排序 } void PointArray::SortC() { //依据每个Point对象到原点的距离大小排序 }
public class Client {
返回目录
private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation() {
it = agg.createIterator();
while( !it.isDone() ) { System.out.println(it.currentItem().toString()); it.next(); } } public static void main(String[] args) { Client client = new Client(); client.operation(); }
返回目录
应用举例之白箱例子
Aggregate:
abstract public class Aggregate { public Iterator createIterator() { return null; } }
Iterator:
public interface Iterator { void first(); voject currentItem(); }
返回目录
ConcreteAggregate:
public class ConcreteAggregate extends Aggregate { private Object[] objs = {"Monk Tang","Monkey", "Pigs","Sandy", "Horse"};
public Iterator createIterator() { return new ConcreteIterator(); } private class ConcreteIterator implements Iterator { private int currentIndex = 0; public void first() { currentIndex = 0; } public void next() { if ( currentIndex < objs.length ) currentIndex++; }
返回目录
public class ConcreteIterator implements Iterator { private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg) { this.agg = agg; size = agg.size(); index = 0 ; } public void first() { index = 0 ; }
返回目录
7.10 策略模式(Strategy)
一.策略模式的由来 二.策略模式的意图及适用性 三.策略模式的结构及参与者 四.应用举例 五.效果说明
返回目录
7.10.1 策略模式的由来
有多种算法实现同一个功能,客户希望在运行时根 据上下文选择其中一个算法。 例如:对于平面上的点坐标数组进行排序,根据不 同的上下文环境可能有三种算法:一是按照点的 X坐标大小排序;二是按照点的Y坐标大小排序; 三是按照点到原点的距离大小排序。通常我们首 先会想到用三个函数分别实现这三种算法,再用 条件判断语句根据上下文环境选择其中一个算法 实现。
返回目录
7.3.3 迭代子模式的结构和参与者
迭代子模式结构图
返回目录
7.3.3 迭代子模式的结构和参与者
迭代器(Iterator) 迭代器定义访问和遍历元素的接口。 具体迭代器(ConcreteIterator) 1.具体迭代器实现迭代器接口。 2.对该聚合遍历时跟踪当前位置。 聚合(Aggregate) 聚合定义创建相应迭代器对象的接口。 具体聚合(ConcreteAggregate) 具体聚合实现创建相应迭代器的接口,该操作 返回 具体迭代器 的一个适当的实例。
返回目录
课堂练习
一个聚合对象如列表list应该提供一种方法 让别人可以访问它的元素,而又不需要暴 露它的内部结构。针对不同的需要,要以 前序、中序和后序三种方式来遍历列表; 列表list有普通列表Generallist,还有特殊 特殊结构的列表Skiplist(类似平衡树性质的 数据结构)。我们希望遍历方式对两种列别 都适用,请写出使用迭代子模式的代码。
返回目录
7.3 跌代子模式(Iterator)
一、迭代子模式的由来 二、迭代子模式的意图及适用性 三、迭代子模式的结构及参与者 四、应用举例 五、效果分析
返回目录
7.3.1 迭代子模式的由来
以集合对象为例,集合是一个管理和组织数据对 象的数据结构。这就表明集合首先应具备一个基 本属性,就是集合能够存储数据。这其中包含存 储数据的类型、存储空间的大小、存储空间的分 配、以及存储的方式和顺序。不具备这些特点, 则该对象就不成其为集合对象。也就是说,上述 这些属性是集合对象与身俱来的,是其密不可分 的职责。然而,集合对象除了能够存储数据外, 还必须提供访问其内部数据的行为方式,这是一 种遍历机制。同时这种遍历方式,或会根据不同 的情形提供不同的实现,如顺序遍历,逆序遍历, 或是二叉树结构的中序、前序、后序遍历。
}
返回目录
应用举例之黑箱例子
Iterator: public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); } Aggregate:
abstract public class Aggregate { public Iterator createIterator() { return null; } }
返回目录
public boolean isDone() { return (currentIndex == objs.length); } public Object currentItem() { return objs[currentIndex]; } } }
Client:
public class Client { private Iterator it;
第七章 行为型设计模式
目录
7.1 模板方法模式(Template method) 7.2 观察者模式(Oberserver) 7.3 跌代子模式(Iterator) 7.4 责任链模式(Chain of Responsibility) 7.5 备忘录模式(Memento) 7.6 命令模式 (Command) 7.7 状态模式(State) 7.8 访问者模式(Visitor) 7.9 中介者模式(Mediator) 7.10 策略模式(Strategy)
返回目录
public void next() { if (index < size) { index++; } } public bool isDone() { return (index >= size); } public Object currentItem() { return agg.getElement(index); } } Client:
返回目录
7.3.2 迭代子模式的意图和适用性
模式的意图 迭代子模式的目的是设计一个迭代器, 这迭代器提供一种方法,可以顺序访问一 个聚合对象中的各个元素,但又不暴露该 对象的内部表示
返回目录
7.3.2 迭代子模式的意图和适用性
以下情况可以使用迭代子模式: 1.访问一个聚合对象的内容而无需暴露它的 内部表示。 2.支持对聚合对象的多种遍历。 3.为遍历不同的聚合结构提供一个统一的接 口 (即, 支持多态迭代)。
返回目录