#软件构造 复用性与各种设计模式(2)行为类模式

行为类模式 :描述类/对象交互和互相分配责任的方式,允许算法和对象职责分配之间的选择(“谁做什么”);简化在运行时难以追踪的复杂的控制流。

一.行为类模式

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();

UML图

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),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值