前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的观察者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教。
小威在此先感谢各位大佬啦~~
个人主页:小威要向诸佬学习呀
个人简介:大家好,我是小威,一个想要与大家共同进步的男人
目前状况:24届毕业生,在一家满意的公司实习欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能够自动地得到通知并进行更新。这种模式也被称作是发布-订阅(Publish/Subscribe)模式。
观察者模式包含以下角色:
抽象主题(Subject):它把所有观察者对象的引用保存在一个聚集里,并提供了增加和删除观察者的方法。它可以是接口或抽象类。
具体主题(Concrete Subject):它将有关状态存入具体观察者对象;当它的状态发生改变时,向它的各个观察者发出通知。
抽象观察者(Observer):它是观察者的抽象类,它定义了一个更新接口,使得在得到主题通知时更新自己。
具体观察者(Concrete Observer):实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态相协调。
观察者模式的实现通常采取基于接口的编程方式,下面是一个使用 Java 实现观察者模式的示例代码:
// 抽象主题
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
// 具体主题
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
@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(this);
}
}
}
// 抽象观察者
public interface Observer {
void update(Subject subject);
}
// 具体观察者
public class ConcreteObserver implements Observer {
private int state;
@Override
public void update(Subject subject) {
if (subject instanceof ConcreteSubject) {
state = ((ConcreteSubject) subject).getState();
System.out.println("State changed to " + state);
}
}
}
// 示例代码
public class Example {
public static void main(String[] args) {
// 创建主题和观察者
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();
// 注册观察者
subject.attach(observer1);
subject.attach(observer2);
// 改变主题状态,观察者将收到通知并更新自己的状态
subject.setState(1);
subject.setState(2);
// 注销观察者
subject.detach(observer2);
// 再次改变主题状态,此时只有 observer1 收到通知
subject.setState(3);
}
}
上面的示例代码中,ConcreteSubject 作为具体主题,继承了 Subject 接口并实现了其中的方法;ConcreteObserver 作为具体观察者,实现了 Observer 接口中的方法。当主题的状态发生改变时,会调用 notifyObservers() 方法通知所有注册过的观察者进行更新。
使用观察者模式能够建立松耦合的设计,让对象之间的依赖关系更加灵活,是一种我们再项目中常用的设计模式。
观察者模式具有松耦合、可扩展性强等优点,使得我们能够在不影响主题和观察者之间关系的前提下增加新的观察者,从而在一定程度上提高了代码的灵活性和可维护性。其缺点是需要考虑到并发问题。
好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论
希望能和诸佬们一起努力,今后我们顶峰相见
再次感谢各位小伙伴儿们的支持