地方门户网站搭建系统,做网站有啥软件,wordpress 曹鹏,ui培训学费一般多少小谈设计模式#xff08;15#xff09;—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject#xff08;被观察者#xff09;ConcreteSubject#xff08;具体被观察者#xff09;Observer#xff08;观察者#xff09;ConcreteObserver#xff0… 小谈设计模式15—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject被观察者ConcreteSubject具体被观察者Observer观察者ConcreteObserver具体观察者 Java程序实现输出结果程序分析 优缺点分析优点解耦性可扩展性一对多关系 缺点观察者过多循环依赖更新顺序问题 总结 专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结希望有兴趣的小伙伴们可以看一下会持续更新的。希望各位可以监督我我们一起学习进步加油各位。
观察者模式
观察者模式Observer Pattern是一种行为型设计模式它定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象当主题对象发生变化时它的所有观察者都会收到通知并更新自己。 核心思想
将观察者和被观察者之间的依赖关系解耦使其彼此之间可以独立变化。被观察者只需要知道观察者实现了某个接口而不需要知道具体的观察者类同样观察者只需要知道被观察者实现了某个接口而不需要知道具体的被观察者类。
主要角色
Subject被观察者
定义了被观察者的接口包含注册观察者、移除观察者和通知观察者的方法。
ConcreteSubject具体被观察者
实现了被观察者接口维护观察者列表并在状态发生改变时通知观察者。
Observer观察者
定义了观察者的接口包含更新方法用于接收被观察者的通知。
ConcreteObserver具体观察者
实现了观察者接口具体实现更新方法在接收到被观察者的通知时进行相应的处理。
Java程序实现
// 定义观察者接口
interface Observer {void update(String message);
}// 定义被观察者接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);
}// 具体观察者类
class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name name;}Overridepublic void update(String message) {System.out.println(name received message: message);}
}// 具体被观察者类
class ConcreteSubject implements Subject {private ListObserver observers new ArrayList();Overridepublic void registerObserver(Observer observer) {observers.add(observer);}Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}// 测试代码
public class ObserverPatternExample {public static void main(String[] args) {ConcreteSubject subject new ConcreteSubject();Observer observer1 new ConcreteObserver(Observer 1);Observer observer2 new ConcreteObserver(Observer 2);subject.registerObserver(observer1);subject.registerObserver(observer2);subject.notifyObservers(Hello, observers!);subject.removeObserver(observer2);subject.notifyObservers(Observer 2 has been removed!);}
}输出结果
Observer 1 received message: Hello, observers!
Observer 2 received message: Hello, observers!
Observer 1 received message: Observer 2 has been removed!程序分析
在上述示例中我们定义了一个观察者接口Observer和一个被观察者接口Subject。具体观察者类ConcreteObserver和具体被观察者类ConcreteSubject实现了对应的接口。
优缺点分析
优点
解耦性
观察者模式可以将观察者和被观察者之间的依赖关系解耦使得它们可以独立变化。当被观察者发生变化时只需要通知观察者即可而不需要知道具体有哪些观察者存在。
可扩展性
观察者模式可以很方便地增加新的观察者而不需要修改被观察者的代码。这符合开闭原则使得系统更加灵活和可扩展。
一对多关系
观察者模式可以实现一对多的依赖关系一个被观察者可以有多个观察者。这样可以方便地实现事件监听、消息订阅等功能。 缺点
观察者过多
当观察者过多时被观察者通知观察者的时间可能会较长影响系统的性能。
循环依赖
如果观察者和被观察者之间存在循环依赖关系可能会导致系统出现问题如死锁等。
更新顺序问题
观察者模式中观察者的更新顺序是不确定的可能会导致观察者之间的依赖关系出现问题。
总结
可以提高系统的灵活性和可扩展性。但同时也需要注意观察者过多、循环依赖和更新顺序等问题以确保系统的稳定性和性能。在使用观察者模式时需要根据具体的场景和需求进行权衡和设计。