命令模式
是什么
将一个请求封装成为一个对象,
从而可以使用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及可以撤销的操作
实例
请求封装成为对象
//用来声明执行操作的接口
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver=receiver;
}
//执行命令
abstract public void excuteCommand();
}
//具体操作类
class FengCommand extends Command{
public FengCommand(Receiver receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.fengzhan();
}
}
class DengCommand extends Command{
public DengCommand(Receiver receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.deng();
}
}
迭代器模式
是什么
提供一种方法顺序访问一个聚合对象中的各个元素
又不暴露该对象的内部表示
实例
观察者模式
是什么
又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当这个主题对象的状态发生变化的时候,会通知所有的观察者对象,使得他们可以自己自动更新自己
实例
class Cat implements Subject {
private List<Observer> observers;
private boolean isShouting;
public Cat() {
observers = new ArrayList<>();
isShouting = false;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update("猫叫");
}
}
// 模拟猫大叫的方法
public void shout() {
isShouting = true;
System.out.println("猫叫!");
notifyObservers();
}
}
策略模式
是什么
定义算法家族,分别封装,让他们之间而言互相替换,此模式让算法的变化不会影响到使用算法的客户
实例
class Context {
Strategy strategy;
//初始化时,传入具体的策略对象
public Context(Strategy strategy)
{
this.strategy=strategy;
}
//根据具体的策略对象,调用方法
public void encrypt()
{
strategy.encrypt();
}
}
总结
相同点
- 行为型模式:它们都属于行为型设计模式,专注于对象之间的交互和通信。
- 提高扩展性:这些模式都能在一定程度上提高系统的扩展性和可维护性,通过引入抽象层或接口,使得新的实现可以更容易地被添加和替换。
不同点
-
关注点:
- 命令模式:关注的是解耦问题,特别是请求者和执行者之间的解耦。通过封装请求为命令对象,可以实现请求的排队、撤销和恢复等操作。
- 迭代器模式:关注的是集合对象的遍历行为,提供了一种在不暴露集合底层表示的情况下顺序访问集合元素的方法。
- 观察者模式:定义了一种一对多的依赖关系,当被观察对象状态改变时,所有观察者都会收到通知。它建立了一套触发机制,使得对象之间的交互更加灵活。
- 策略模式:关注的是算法的自由切换和封装,使得算法的变化独立于使用算法的客户。通过定义一系列算法,并将它们封装为可互换的策略对象,使得算法的变化不会影响到客户端代码。
-
结构:
- 命令模式:包含命令接口、具体命令类、接收者类和调用者类。命令接口定义了执行命令的方法,具体命令类实现了这个接口并指定了接收者。接收者类负责执行具体的操作,调用者类则通过命令对象来间接调用接收者的方法。
- 迭代器模式:包含迭代器接口、具体迭代器类和可迭代对象接口(有时为具体可迭代对象)。迭代器接口定义了遍历集合元素的方法,具体迭代器类实现了这个接口并持有一个指向当前元素的引用。可迭代对象接口定义了创建迭代器的方法。
- 观察者模式:包含主题接口、具体主题类和观察者接口(有时为具体观察者类)。主题接口定义了注册、移除和通知观察者的方法,具体主题类实现了这个接口并维护了一个观察者列表。观察者接口定义了更新方法,具体观察者类实现了这个方法以响应主题状态的变化。
- 策略模式:包含策略接口和具体策略类。策略接口定义了算法的共同行为,具体策略类实现了这个接口并提供了具体的算法实现。客户端代码通过策略接口来调用具体的算法。
-
应用场景:
- 命令模式:适用于需要将请求调用者和请求接受者解耦的场景,或者需要支持命令的撤销和恢复操作的场景。
- 迭代器模式:适用于需要遍历集合元素的场景,特别是当集合的内部表示可能发生变化时。
- 观察者模式:适用于当一个对象的状态改变时,需要通知其他对象的场景。它建立了一种一对多的依赖关系,使得对象之间的交互更加灵活和动态。
- 策略模式:适用于算法要求变换的场景,或者需要封装多个不同算法的场景。通过策略模式,可以方便地切换不同的算法,而不会影响到客户端代码。
-
优缺点:
- 命令模式:优点包括降低了系统的耦合度、易于添加新的命令、支持命令队列和撤销恢复操作等;缺点是可能导致过多的具体命令类。
- 迭代器模式:优点包括简化集合遍历、隐藏内部实现、支持多种遍历方式和简化客户端代码等;缺点是增加了类的数量、可能不适合简单集合以及存在一定的性能开销。
- 观察者模式:优点包括观察者和被观察者是抽象耦合的、建立一套触发机制等;缺点是通知所有观察者可能会花费很多时间、循环依赖可能导致系统崩溃以及没有机制让观察者知道目标对象是如何变化的。
- 策略模式:优点包括算法独立、易于管理、易于扩展和符合开闭原则等;缺点是客户端必须知道所有的策略类并自行决定使用哪一个策略类。