1.观察者模式
观察者这模式定义了对象之间一对多依赖,这样一来,当一个对象的改变时,它的所有依赖者都会受到通知并自动更新。
2.举个例子:小明快要高考了,小明的妈妈和爸爸监控着家里的电脑,一旦有人使用就会收到通知。这时小明的爸爸妈妈就为观察者(Observer),而电脑是否被使用就是一个主题(Subject)。小明的爸爸妈妈的信息需要注册到电脑中,当电脑被使用是他们才能收到通知。
(1).首先定义一个主题接口(定义了一些必要的方法)
//主题接口类 public interface Subject { void registerObserver(Observer observer); //将观察者注册到主题类中 void removeObserver(Observer observer); //移除观察者 void notifyObservers(); //通知所有的观察者 }
(2).定义一个电脑的状态的主题
public class ComputerState implements Subject { private ArrayList<Observer> observerArrayList = new ArrayList<>(); //保存了所有的观察者 @Override public void registerObserver(Observer observer) { observerArrayList.add(observer); //将观察者注册到主题中 } @Override public void removeObserver(Observer observer) { //移除观察者 observerArrayList.remove(observer); } @Override public void notifyObservers() { //通知所有的观察者 for (Observer o : observerArrayList) { o.update("有人在玩儿电脑了。。。"); } } public void someOneUserComputer() { //电脑被人操作了 notifyObservers(); } }
在此例中,注册方法表示这个观察者(小明的爸爸,妈妈,当然如果他的七大姑,八大姨如果想知道也可以进行注册。。。。)想要知道小明是否在玩电脑。
(3)定义观察者接口
//观察者接口类 public interface Observer { void update(String string); //用来通知观察者的方法,这里是发送一个信息(字符串) }
(4)具体的观察者
public class XiaoMingFather implements Observer { //小明的爸爸 private Subject subject; public XiaoMingFather(Subject subject) { this.subject = subject; subject.registerObserver(this); //将自己的信息注册到主题中 } @Override public void update(String string) { System.out.println("小明爸爸知道" + string); } }
public class XiaoMingMother implements Observer { //小明的妈妈 private Subject subject; public XiaoMingMother(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String string) { System.out.println("小明妈妈知道" + string); } }
(5)这是小明。。。(作为测试)
public class XiaoMing { ComputerState computerState; public XiaoMing(ComputerState computerState) { this.computerState = computerState; } public void playGame(){ computerState.someOneUserComputer(); } }
3.最后做个测试
public class Test { public static void main(String[] args) { ComputerState computerState = new ComputerState(); //这是一个电脑 XiaoMingMother mother = new XiaoMingMother(computerState); //小明妈妈 XiaoMingFather father = new XiaoMingFather(computerState); //小明爸爸 XiaoMing xiaoMing = new XiaoMing(computerState); //小明 xiaoMing.playGame(); //小明在作死。。。。。 } }
运行结果
最后。。。小明可能会比较惨
相关的代码放在 https://github.com/LiWangCai/blogRelated 上面,可自行获取