观察者模式:在对象之间定义一对多的依赖,这样以来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
设计原则:
- 为交互对象之间的松耦合设计而努力
举例说明
场景:LOL中有一个英雄名字叫索拉卡,当这个英雄释放R技能时,会使其队友回血。
需求:实现当索拉卡执行R技能时,给队友回血。
1.定义一个被观察的接口Observable(也叫主题:Subject),并让索拉卡实现此接口
- 新建subject接口
-
/** * 主题接口 * * @author jsk * @Date 2018/11/17 13:41 */ public interface Subject { /** * 注册观察者 * * @param o */ void registerObserver(Observer o); /** * 移除观察者 * * @param o */ void removeObserver(Observer o); /** * 通知观察者 */ void notifyObservers(); }
- 新建索拉卡实体类
-
/** * 众星之子 索拉卡 * * @author jsk * @Date 2018/11/17 13:49 */ public class Soraka implements Subject { private List<Observer> observerList = new ArrayList<>(); @Override public void registerObserver(Observer o) { observerList.add(o); } @Override public void removeObserver(Observer o) { observerList.remove(o); } @Override public void notifyObservers() { for (Observer observer : observerList) { observer.update(); } } public void executeR() { System.out.println("索拉卡执行R技能,给队友加血!"); this.notifyObservers(); } }
2.定义一个观察者接口Observer,并让英雄实体类Hero实现这个接口。
- 新建观察者接口Observer
-
public interface Observer { void update(); }
- 新建英雄类Hero
-
/** * 英雄实体类 * * @author jsk * @Date 2018/11/17 13:55 */ public class Hero implements Observer { private String name; public Hero(String name) { this.name = name; } @Override public void update() { System.out.println(name + "开始回血..."); } }
3.运行程序
-
public static void main(String[] args) { // 1.创建三个英雄和索拉卡 Hero Garen = new Hero("盖伦"); Hero Ashe = new Hero("艾希"); Hero Brand= new Hero("布兰德"); Soraka soraka = new Soraka(); // 2.把这三个英雄注册到索拉卡 soraka.registerObserver(Garen); soraka.registerObserver(Ashe); soraka.registerObserver(Brand); // 3.索拉卡执行R技能 soraka.executeR(); }
4.运行结果