行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
观察者模式的主要组成部分
- Subject(主题):也称为“被观察者”,它是状态发生变化的对象,负责管理观察者列表并向其发送通知。
- Observer(观察者):是依赖于主题对象的对象,它在主题对象发生变化时收到通知并进行相应的更新。
- ConcreteSubject(具体主题):实现了Subject接口,持有状态,并在状态改变时通知观察者。
- ConcreteObserver(具体观察者):实现了Observer接口,根据主题状态的变化更新自己。
观察者模式的工作流程
- 注册观察者:观察者通过
attach()
方法注册到主题对象上。 - 状态变化:主题对象的状态发生变化时,通过
notifyObservers()
通知所有注册的观察者。 - 更新观察者:每个观察者调用
update()
方法来响应主题的状态变化。
观察者模式的优点
- 松耦合:主题和观察者之间只通过接口进行交互,减少了它们之间的耦合度,主题和观察者之间的关系是动态的,可以方便地添加和删除观察者。
- 易于扩展:增加新的观察者非常方便,无需修改主题类的代码,只需要实现Observer接口即可。
// 观察者接口,所有具体观察者都需要实现这个接口
interface Observer {
void update(String message); // 当主题发生变化时,通知观察者
}
// 具体观察者,处理主题变化时的具体操作
class ConcreteObserver implements Observer {
private String observerName;
public ConcreteObserver(String name) {
this.observerName = name;
}
@Override
public void update(String message) {
System.out.println(observerName + " 收到消息: " + message);
}
}
// 主题接口,定义了观察者注册、注销和通知的操作
interface Subject {
void attach(Observer observer); // 添加观察者
void detach(Observer observer); // 移除观察者
void notifyObservers(); // 通知所有观察者
}
// 具体主题,管理观察者并发出通知
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
// 设置状态,并通知观察者
public void setState(String state) {
this.state = state;
notifyObservers(); // 当状态变化时,通知所有观察者
}
public String getState() {
return state;
}
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update("主题状态已更改为: " + state);
}
}
}
// 测试代码
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建主题和观察者
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("观察者1");
Observer observer2 = new ConcreteObserver("观察者2");
Observer observer3 = new ConcreteObserver("观察者3");
// 注册观察者
subject.attach(observer1);
subject.attach(observer2);
subject.attach(observer3);
// 改变主题的状态,通知所有观察者
System.out.println("改变主题状态为 '状态1'");
subject.setState("状态1");
// 移除一个观察者
subject.detach(observer2);
// 改变主题的状态,通知剩余观察者
System.out.println("\n改变主题状态为 '状态2'");
subject.setState("状态2");
}
}