java学习-设计模式-observer模式
一 定义
观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
二 代码实例
-
需求
前台帮忙盯着老板的到来,然后通知所要通知的人,开始认真工作
-
代码实现
主题抽象类:
public abstract class Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } public abstract void attach(Observer observer); public abstract void detach(Observer observer); public abstract void inform(); }
主题实现类:
public class Boss extends Subject {//观察的对象 private List<Observer> observers = new ArrayList<>(); @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void inform() { for (Observer obs : observers) { obs.update(); } } }
public class Secretary extends Subject { private List<Observer> observers = new ArrayList<>(); @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void inform() { for (Observer obs : observers) { obs.update(); } } }
观察者抽象类:
public abstract class Observer { private String name; private Subject subject; public Observer(String name, Subject subject) { this.name = name; this.subject = subject; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Subject getSubject() { return subject; } public void setSubject(Subject subject) { this.subject = subject; } public abstract void update(); }
观察者实现类:
public class NBAObserver extends Observer {//具体通知的对象 public NBAObserver(String name, Subject subject) { super(name, subject); } @Override public void update() { System.out.println(getSubject().getSubjectState() + "," + getName() + "关闭NBA比赛直播,继续工作"); } }
public class StockObserver extends Observer { public StockObserver(String name, Subject subject) { super(name, subject); } @Override public void update() { System.out.println(getSubject().getSubjectState() + "," + getName() + "关闭股票行情,继续工作"); } }
测试类:
public class Test { public static void main(String[] args) { Secretary secretary = new Secretary(); secretary.attach(new StockObserver("张三",secretary)); secretary.attach(new NBAObserver("李四",secretary)); secretary.setSubjectState("老板回来了"); secretary.inform(); } }
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。