赞
踩
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,其所有依赖者(观察者)都会自动收到通知并进行更新。
在观察者模式中,存在两类角色:
主题维护了一个观察者列表,当其内部状态发生变化时,会通知所有注册的观察者对象,使它们能够根据主题状态的变化进行相应的更新或处理。
观察者模式将主题和观察者解耦,使得主题和观察者之间的依赖关系变得松散,同时也提高了系统的灵活性和可扩展性。这种模式常用于订阅/发布系统、事件驱动系统以及需要一对多依赖关系的场景中。
下面是一个稍微复杂一些的观察者模式的示例,多个不同的观察者监听某个事件,并根据事件执行不同的操作(发送短信、发送邮件等):
// 事件接口 public interface Event { String getEventData(); } // 具体事件类 public class ConcreteEvent implements Event { private String eventData; public ConcreteEvent(String data) { this.eventData = data; } @Override public String getEventData() { return eventData; } }
// 观察者接口 public interface Observer { void update(Event event); } // 具体观察者 -- 邮件 public class EmailObserver implements Observer { @Override public void update(Event event) { System.out.println("发送邮件: " + event.getEventData()); } } // 具体观察者 -- 短信 public class SMSObserver implements Observer { @Override public void update(Event event) { System.out.println("发送短信: " + event.getEventData()); } }
// 主题接口 public interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObservers(Event event); } import java.util.ArrayList; import java.util.List; // 具体主题 public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObservers(Event event) { for (Observer observer : observers) { observer.update(event); } } }
public class ObserverPatternExample {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer smsObserver = new SMSObserver();
Observer emailObserver = new EmailObserver();
subject.attach(smsObserver);
subject.attach(emailObserver);
Event event = new ConcreteEvent("你正在登录账户,查看Alian的博客");
subject.notifyObservers(event);
}
}
运行结果:
发送短信: 你正在登录账户,查看Alian的博客
发送邮件: 你正在登录账户,查看Alian的博客
观察者模式具有以下优点和缺点:
优点
缺点
总的来说,观察者模式是一种灵活、解耦的设计模式,能够实现对象间的一对多依赖关系。然而,在使用时需注意控制观察者数量、避免循环依赖和及时移除不需要的观察者,以确保系统的性能和稳定性。这个模式应用很广泛,比如springboot源码的事件发布机制。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。