行为类模式 :描述类/对象交互和互相分配责任的方式,允许算法和对象职责分配之间的选择(“谁做什么”);简化在运行时难以追踪的复杂的控制流。
一.行为类模式
1.策略模式
有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里
为不同的是实现算法构造抽象接口,利用委派,运行时动态传入满足客户端倾向的算法类实例。
参考之前的博客
https://blog.csdn.net/Franklins_Fan/article/details/106139748
其中有对策略模式的总结
2.模板模式
几个客户机共享相同的算法,但在细节上有所不同。比如该算法由可定制部分和不变部分组成。公共步骤不应该在子类中重复,而是需要重用,总的来说,就是做事情的步骤一样,但具体方法不同;共性的步骤在抽象类内公共实现,而差异化的步骤在各个子类中实现 。
完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。
实例:
例如对于一个处理购买商品的类
public abstract class OrderProcessTemplate {
public boolean isGift;
public abstract void doSelect();
public abstract void doPayment();
public final void giftWrap() {
System.out.println("Gift wrap done.");
}
public abstract void doDelivery();
public final void processOrder() {
doSelect();
doPayment();
if (isGift) giftWrap();
doDelivery();
}
}
这个抽象类作为模板,提供两种具体的购买方式
例如:
public class NetOrder extends OrderProcessTemplate {
@Override public void doSelect() { … }
@Override public void doPayment() { … }
@Override public void doDelivery() { … }
}
在调用时,只需调用具体的类即可
OrderProcessTemplate netOrder = new NetOrder();
netOrder.processOrder();
OrderProcessTemplate storeOrder = new StoreOrder();
storeOrder.processOrder();
3.迭代器模式
客户端希望遍历被放入 容器/集合类的一组ADT对象,无需关心容器的具体类型,不管对象被放进哪里,都提供同样的遍历方式 。能够提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
-
Abstract Iterator(迭代器):迭代器定义访问和遍历元素的接口
-
Concret eIterator (具体迭代器)具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
-
Interface Aggregate (聚合) 聚合定义创建相应迭代器对象的接口
-
Concrete Aggregate (具体聚合)具体聚合实现创建相应迭代器的接口,返回Iterator的一个适当的实例
实例:
public class Pair<E> implements Iterable<E> {
private final E first, second;
public Pair(E f, E s) {
first = f;
second = s;
}
public Iterator<E> iterator() {
return new PairIterator();
}
private class PairIterator implements Iterator<E> {
private boolean seenFirst = false, seenSecond = false;
public boolean hasNext() {
return !seenSecond;
}
public E next() {
if (!seenFirst) {
seenFirst = true;
return first;
}
if (!seenSecond) {
seenSecond = true;
return second;
}
throw new NoSuchElementException();
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
让集合类实现Iterable接口,并实现独特Iterator迭代器(hasNext, next, remove),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历即可。