观察者模式
定义:观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。
具体实现:
1.Subject(被观察的对象接口):定义一个被观察者接口,每一个被观察者都可以有多个观察者。
2.ConcreteSubject(具体被观察对象):实现了被观察者接口,如果自身状态发生改变,通知所有的观察者。
3.Observer(观察者接口): 定义一个观察者接口,内部定义一个方法,在被观察对象状态改变时会被调用。
4.ConcreteObserver(具体观察者): 实现了观察者接口,重写被观察者状态改变时调用的方法。
案例简述:我由于生意不好(被观察者),找张三,李四,王五等人(观察者)借了钱,但是呢我现在没有钱还,他们经常打电话找我要,我觉得烦,他们也觉得烦,然后我就说了,就算你们一直打电话催,我也还是没钱,这样吧,你们也别催了,等我有钱了,我通知你们来拿钱。
定义一个被观察者的接口,其中定义借钱和通知观察者的方法。
package com.sj.observerPattern;
//定义抽象被观察者
public interface Subject {
//借钱
void borrowMonkey(Observer moniter);
//通知债主,我可以还钱了
void notifyObserver(String message);
}
创建一个具体的被观察对象,实现借钱和通知的方法。
package com.sj.observerPattern;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
//债主不止一个,用集合保存
private List<Observer> list = new ArrayList<>();
//我向哪些人借了钱
@Override
public void borrowMonkey(Observer moniter) {
list.add(moniter);
}
//通知他们,我可以还钱了
@Override
public void notifyObserver(String message) {
for (Observer moniter : list) {
moniter.takeMoney(message);
}
}
}
抽象观察者,其中定义一个要钱的方法
package com.sj.observerPattern;
public interface Observer {
//要钱的方法
void takeMoney(String s);
}
具体的观察者,实现要钱方法
package com.sj.observerPattern;
public class ConcreteObserver implements Observer {
private String name;
private ConcreteObserver(String name) {
this.name = name;
}
@Override
public void takeMoney(String message) {
System.out.println(name+"知道了,"+message+"。");
}
}
定义测试类进行代码测试
package com.sj.observerPattern;
public class Test {
public static void main(String[] args) {
//m就代表我(被观察者)
Subject m = new ConcreteSubject();
//Observer代表那债主(观察者)
Observer observer1 = new ConcreteObserver("张三");
Observer observer2 = new ConcreteObserver("李四");
Observer observer3 = new ConcreteObserver("王五");
//我向哪些人借了钱
m.borrowMonkey(observer1);
m.borrowMonkey(observer2);
m.borrowMonkey(observer3);
//通知他们我可以还钱了
m.notifyObserver("我可以还钱了");
}
}
/*
输出结果:
张三知道了,我可以还钱了。
李四知道了,我可以还钱了。
王五知道了,我可以还钱了。
*/