观察者模式
2020-07-26 本文已影响0人
Stephenwish
观察者本质是发布订阅模式,一个类变化了,通知其他和这个类有关联的类,并且跟着变化
第一步先写一个简单的一个类执行方法触发另一个类的方法(简单观察者模型)后面在升级
//被观察的类
public abstract class Subject {
abstract void doMethod1();
abstract void doMethod2();
}
//观察类
public abstract class Observer {
abstract void doMethodA();
abstract void doMethodB();
}
两个抽象各自具体实现
public class SubjectImpl extends Subject{
private Observer observer=new AObserverImpl();
@Override
void doMethod1() {
System.err.println("被观察的类发出动作1");
observer.doMethodA();
}
@Override
void doMethod2() {
System.err.println("被观察的类发出动作2");
}
}
public class AObserverImpl extends Observer{
@Override
void doMethodA() {
System.err.println("发现观察对象有行为,我也跟着做执行对应方法A");
}
@Override
void doMethodB() {
System.err.println("发现观察对象有行为,我也跟着做执行对应方法B");
}
}
再写一个测试类
public class Client {
public static void main(String[] args) {
Subject subject = new SubjectImpl();
subject.doMethod1();
}
}
//输出
//>>>>被观察的类发出动作1
//发现观察对象有行为,我也跟着做执行对应方法
Subject 类有多个关联的类,不止一个,需要全部通知,把一个实现换成多个,用List改造下。
public class SubjectImpl extends Subject{
private List<Observer> observers=new ArrayList<>();
public void addObserver(Observer observer){
observers.add(observer);
}
public void deleteObserver(Observer observer){
observers.remove(observer);
}
@Override
void doMethod1() {
System.err.println("被观察的类发出动作1");
for (Observer observer : observers) {
observer.doMethodA();
}
}
@Override
void doMethod2() {
System.err.println("被观察的类发出动作2");
}
}
public class Client {
public static void main(String[] args) {
Observer observerA = new AObserverImpl();
Observer observerB = new BObserverImpl();
SubjectImpl subject = new SubjectImpl();
subject.addObserver(observerA);
subject.addObserver(observerB);
subject.doMethod1();
}
}
在优化,在对代码SubjectImpl 里面的方法分离下观察对象为一个接口,方便以后扩展
public interface IBeiGuanCha {
void addObserver(Observer observer);
void deleteObserver(Observer observer);
}
public class SubjectImpl extends Subject implements IBeiGuanCha{
private List<Observer> observers=new ArrayList<>();
@Override
public void addObserver(Observer observer){
observers.add(observer);
}
@Override
public void deleteObserver(Observer observer){
observers.remove(observer);
}
@Override
void doMethod1() {
System.err.println("被观察的类发出动作1");
for (Observer observer : observers) {
observer.doMethodA();
}
}
@Override
void doMethod2() {
System.err.println("被观察的类发出动作2");
}
}