设计模式--观察者模式
观察者模式:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。
观察者模式组成:
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口。
简单通俗例子:每当老板发布任务,下面工作人员都会受到任务并开始自己的工作。
被观察者接口:
package com.csk.degisnModel; public interface Subject { public void registObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObserver(); }
观察者接口:
package com.csk.degisnModel; public interface Observer { public void update(String task); }
具体被观察者----老板
package com.csk.degisnModel; import java.util.ArrayList; import java.util.List; public class Boss implements Subject { private String task; private List<Observer> observers; public Boss() { observers = new ArrayList<>(); } @Override public void registObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { for(Observer observer : observers) { observer.update(task); } } //布置任务 public void assignTask(String task) { this.task = task; notifyObserver(); } }
具体观察者---美工、开发、测试
package com.csk.degisnModel; //设计人员 public class Designer implements Observer { @Override public void update(String task) { System.out.println("Designer:我要开始" + task + "项目的设计了!"); } } package com.csk.degisnModel; //开发人员 public class Developer implements Observer { @Override public void update(String task) { System.out.println("Developer:我要开始" + task + "项目的开发了!"); } } package com.csk.degisnModel; //测试人员 public class QA implements Observer { @Override public void update(String task) { System.out.println("QA:我要开始" + task + "项目的测试了!"); } }
老板招了3个工作人员,岗位分别是美工、开发、测试,并下达了一个任务:开发图书管理系统项目
package com.csk.degisnModel; public class Test { public static void main(String[] args) { Boss boss = new Boss(); Developer developer = new Developer(); Designer designer = new Designer(); QA qa = new QA(); boss.registObserver(developer); boss.registObserver(designer); boss.registObserver(qa); boss.assignTask("图书管理系统"); } }
最后输出:
Developer:我要开始图书管理系统项目的开发了!
Designer:我要开始图书管理系统项目的设计了!
QA:我要开始图书管理系统项目的测试了!

浙公网安备 33010602011771号