一 前言
根据前两篇内容大概了解了观察者模式的应用,但是 applicationContext 的使用是基于 spring 的事件机制, 这篇主要介绍一下其他实现观察者模式的方法,如使用 Subject 和 Observer.
先说理论, 再上代码
使用 Subject 和 Observer, 主要需要了解他有四个角色
- subject 抽象主题类:
1.1 需要包含一个 列表属性,用来保存观察者
1.2 要有两个虚方法,用来增加和删除观察者
1.3 要有一个待实现方法,由具体抽象类来分别实现 - ConcreteSubject 具体主题类:
实现抽象主题类,重写抽象主题类中的待实现方法,遍历抽象主题类中的观察者列表,调用观察者响应方法 - Observer 抽象观察者类:
一个接口类,包含一个观察者响应的方法 - ConcreteObserver 具体观察者类:
4.1 实现抽象观察者类
4.2 重写抽象观察者类中的响应方法
至此四个角色介绍完成,把这四个角色落实,再写一个 client 类测试即可,在 client 测试类中需要将观察者注册到观察者列表中。
二 代码实现
抽象主题类:
public abstract class Subject {
protected ListObserver> observerList = new ArrayListObserver>();
/**
* 增加观察者
* @param observer 观察者
*/
public void add(Observer observer) {
observerList.add(observer);
}
/**
* 注销观察者,从观察者集合中删除一个观察者
* @param observer 观察者
*/
public void remove(Observer observer) {
observerList.remove(observer);
}
/**通知观察者*/
public abstract void notifyObserver();
}
具体主题类:
public class ConcreteSubject extends Subject {
@Override
public void notifyObserver() {
System.out.println("遍历观察者:");
for (Observer observer : observerList) {
observer.response();
}
}
}
抽象观察者类:
public interface Observer {
void response();
}
具体观察者类, 观察者可以有多个,对应不同的处理,这里写两个
public class ConcreteObserver1 implements Observer{
@Override
public void response() {
System.out.println("我是具体观察者ConcreteObserver1");
}
}
public class ConcreteObserver2 implements Observer{
@Override
public void response() {
System.out.println("我是具体观察者ConcreteObserver2");
}
}
到这,功能代码完成,再写测试代码:
public class Client {
public static void main(String[] args) {
Subject concreteSubject = new ConcreteSubject();
//具体观察者
Observer concreteObserver1 = new ConcreteObserver1();
Observer concreteObserver2 = new ConcreteObserver2();
concreteSubject.add(concreteObserver1);
concreteSubject.add(concreteObserver2);
concreteSubject.notifyObserver();
}
}
运行测试代码:
遍历观察者:
我是具体观察者ConcreteObserver1
我是具体观察者ConcreteObserver2
发现通知完成,要注意的是,需要在测试代码中,将观察者注册到主题中,才可以接到该主题的通知。
三 总结
从测试代码上看,优点是主题不需要知道观察者的处理,一定程度保证了松耦合,有新观察者时可以直接实现抽象主题类即可,也符合开闭原则,缺点是主题需要知道所有观察者并将观察者注册进来才能通知。
这是又一种观察者模式的实现方式,可以根据项目需求选择不同实现方式。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net