JAVA设计模式之观察者模式
2016-12-18 22:57
375 查看
JAVA设计模式之观察者模式
概念:
观察者模式(observer),主要用于1:N的通知。当一个对象(目标对象Subject或Objservable,消息发布)的状态变化时,它需要及时通知一系列对象(观察者对象,Observer,消息订阅),令他们做出响应。
通知观察者的两种方式:
推
每次都会把通知以广播方式发送给所有观察者,所有观察者被动接受。
拉
观察者只要知道情况即可。至于什么时候获取内容,都由观察者自主决定。
角色
目标对象Subject具体目标对象ConcreteSubject
抽象观察者接口Observer
具体观察者ConcreteObserver
类图
应用
聊天室程序,服务器发给客户端邮件订阅
Servlet中的监听器实现
Android中的广播机制
群发消息
JDK的AWT中事件处理模型,基于观察者模式的委派事件模型
代码
// 目标对象 public class Subject { protected List observers = new ArrayList<>(); public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } // 通知观察者更新 public void notifyAllObservers() { for (Observer observer : observers) { observer.update(this); } } }
// 具体目标对象 public class ConcreteSubject extends Subject { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; this.notifyAllObservers(); } }
// 观察者接口 public interface Observer { void update(Subject subject); }
// 具体观察者 public class ObserverA implements Observer { private int myState; //与subject保持同步 @Override public void update(Subject subject) { myState = ((ConcreteSubject) subject).getState(); System.out.println("update to " + myState); } public int getMyState() { return myState; } public void setMyState(int myState) { this.myState = myState; } }
// 客户端 public class Main { public static void main(String[] args) { // 创建具体通知者 ConcreteSubject subject = new ConcreteSubject(); // 创建多个观察者 ObserverA observer1 = new ObserverA(); ObserverA observer2 = new ObserverA(); ObserverA observer3 = new ObserverA(); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.registerObserver(observer3); // 改变subject的状态值 subject.setState(1); System.out.println(observer1.getMyState()); System.out.println(observer2.getMyState()); System.out.println(observer3.getMyState()); } }
通过javase 的java.util.Observable, java.util.Observer实现
// 通过java.util.Observable实现目标对象 public class ConcreteSubject2 extends Observable { private int state; public void setState(int state) { this.state = state; setChanged(); notifyObservers(state); } }
// 通过java.util.Observer实现观察者 public class Observer2 implements java.util.Observer { private int myState; @Override public void update(Observable o, Object arg) { myState = (int) arg; } public int getMyState() { return myState; } public void setMyState(int myState) { this.myState = myState; } }
// 通过javase 的java.util.Observable, java.util.Observer实现 public class Main2 { public static void main(String[] args) { ConcreteSubject2 subject2 = new ConcreteSubject2(); Observer2 observer1 = new Observer2(); Observer2 observer2 = new Observer2(); Observer2 observer3 = new Observer2(); subject2.addObserver(observer1); subject2.addObserver(observer2); subject2.addObserver(observer3); subject2.setState(10); System.out.println(observer1.getMyState()); System.out.println(observer2.getMyState()); System.out.println(observer3.getMyState()); } }
相关文章推荐
- java设计模式-观察者模式
- Java设计模式:单态模式,工厂模式,代理模式,观察者模式示例
- java常用类库续3(比较器Comparable、Comparator、观察者设计模式、正则表达式、定时调度)
- java设计模式:观察者模式(Observer)
- JAVA设计模式-观察者模式简单例子
- 使用观察者模式实现Java应用程序设计MVC模式
- Java设计模式_行为模式_观察者模式
- 设计模式---观察者模式(Observer Pattern with java)
- Java设计模式—观察者模式(Observer pattern)
- java 设计模式-观察者模式
- Java设计模式 -- 观察者模式(push方式)
- All About JAVA 关于设计模式中的“观察者模式”
- java设计模式_观察者模式
- Java设计模式-----Observer观察者模式
- Java设计模式之Observer 观察者模式
- Java设计模式 -- 观察者模式(pull方式)
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- 【设计模式】observer观察者模式:模拟java.awt.Button事件监听。
- 设计模式---观察者模式(Observer Pattern with java)