面向复用的设计模式(Behavioral patterns)

Strategy 策略模式

策略模式基础

**问题提出:**假设有多种不同的算法来实现同一个任务,但是要根据client的需要动态切换算法,不是写死在代码里,这种要求应该如何达到?

**解决方案:**为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例
在这里插入图片描述

策略模式实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Template Method模板模式

模板模式基础

问题提出: 几个客户端共享相同的算法,但在细节上有所不同,即算法由可自定义部分和不变部分组成。 普通步骤不应在子类中重复,而需要重用。那么如何实现此模式?

解决方案: 算法的常见步骤被分解成一个抽象类,抽象(未实现)原语操作表示算法的可定制部分。并且使用继承和重写实现模板模式。
在这里插入图片描述

模板模式实例

下面展示一个Template实例

public abstract class CarBuilder {
	protected abstract void BuildSkeleton();
	protected abstract void InstallEngine();
	protected abstract void InstallDoor();
	// Template Method that specifies the general logic
	public void BuildCar() { //通用逻辑
		BuildSkeleton();
		InstallEngine();
		InstallDoor();
	} 
}
public class PorcheBuilder extends CarBuilder {
	protected void BuildSkeleton() {
		System.out.println("Building Porche Skeleton");
	}
	protected void InstallEngine() {
		System.out.println("Installing Porche Engine");
	}
	protected void InstallDoor() {
		System.out.println("Installing Porche Door");
	} 
}
public class BeetleBuilder extends CarBuilder {
	protected void BuildSkeleton() {
		System.out.println("Building Beetle Skeleton");
	}
	protected void InstallEngine() {
		System.out.println("Installing Beetle Engine");
	}
	protected void InstallDoor() {
		System.out.println("Installing Beetle Door");
	} 
}

下面展示一些 main方法

public static void main(String[] args) {
	CarBuilder c = new PorcheBuilder();
	c.BuildCar();
	c = new BeetleBuilder();
	c.BuildCar();
}

执行结果:
在这里插入图片描述

这里也是Template实例
在这里插入图片描述

这是其代码实现

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() { … }
}

Iterator 迭代器

迭代器基础

**问题提出:**客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型。也就是说,不管对象被放进哪里,都应该提供同样的遍历方式。这种遍历方式如何实现?
解决方案: 迭代的策略模式。

迭代器结构

Abstract Iterator class 定义遍历协议
Concrete Iterator subclasses对于每个聚合类(aggregate class)
Aggregate interface创造迭代器的实例
聚合实例保持引用Iterator对象
在这里插入图片描述
Iterable接口:实现该接口的容器对象是可迭代遍历的

public interface Iterable<T> {
	...
	Iterator<T> iterator();
}

Iterator接口:迭代器

public interface Iterator<E> {
	boolean hasNext();
	E next();
	void remove();
}

Iterator pattern:让自己的集合类实现Iterable接口,并实现自己的独特Iterator迭代器(hasNext, next, remove),允许客户端利用这个迭代器进行显式或隐式的迭代遍历:

for (E e : collection) { … }
Iterator<E> iter = collection.iterator(); 
while(iter.hasNext()) { … }
public interface Collection<E> extends Iterable<E> {
	boolean add(E e);
	boolean addAll(Collection<? extends E> c);
	boolean remove(Object e);
	boolean removeAll(Collection<?> c);
	boolean retainAll(Collection<?> c);
	boolean contains(Object e);
	boolean containsAll(Collection<?> c);
	void clear();
	int size();
	boolean isEmpty();
	Iterator<E> iterator();
	Object[] toArray()
	<T> T[] toArray(T[] a);
	…
 }

迭代器实例

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();
		} 
	} 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值