自学内容网 自学内容网

设计模式:5、观察者模式(发布-订阅模式)

目录

0、定义

1、观察者模式的四种角色

2、观察者模式的UML类图

3、示例代码


0、定义

        定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新。

1、观察者模式的四种角色

  • 主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。
  • 观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
  • 具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者
  • 具体观察者(ConcreteObserver):具体观察者是实现观察者接口的类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者

2、观察者模式的UML类图

3、示例代码

观察者:

package xyz.jangle.design.observer;

public interface Observer {

public void update();

}

主题:

package xyz.jangle.design.observer;

public interface Subject {

public void addObserver(Observer observer);

public void deleteObserver(Observer observer);

public void notifyObserver();

}

具体观察者:

package xyz.jangle.design.observer;
/**
 * 具体观察者
 * @author Administrator
 *
 */
public class ConcreteObserver implements Observer {

private Subject subject;

public ConcreteObserver(Subject subject) {
super();
this.subject = subject;
this.subject.addObserver(this);
}

@Override
public void update() {

System.out.println("主题中更新了新内容");

}

}

具体主题:

package xyz.jangle.design.observer;

import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject {

private List<Observer> observers;

public ConcreteSubject() {
super();
observers = new ArrayList<Observer>();
}

@Override
public void addObserver(Observer observer) {
if(!observers.contains(observer)) {
observers.add(observer);
}
}

@Override
public void deleteObserver(Observer observer) {
if(observers.contains(observer)) {
observers.remove(observer);
}
}

@Override
public void notifyObserver() {
for(Observer observer:observers) {
observer.update();
}

}

}

客户端(使用):

package xyz.jangle.design.observer;

public class AppMain5 {

public static void main(String[] args) {

ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(subject);
ConcreteObserver observer2 = new ConcreteObserver(subject);
ConcreteObserver observer3 = new ConcreteObserver(subject);
subject.notifyObserver();
System.out.println("------------------");
subject.deleteObserver(observer1);
subject.notifyObserver();
System.out.println("------------------");
subject.deleteObserver(observer2);
subject.deleteObserver(observer3);
subject.notifyObserver();

}

}


原文地址:https://blog.csdn.net/Bof_jangle/article/details/143943748

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!