观察者模式
Posted 海小鑫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。
观察者模式也是 发布-订阅模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化的时候,会通知所有观察者对象,使他们能够自动更新自己。
观察者模式主要包括以下几个角色:
1、Subject(抽象主题角色)
2、ConcreteSubject(具体的主题角色):它会存有所有观察者的引用,以便于及时通知他们。
3、Observer(抽象观察者角色)
4、ConcreteObserver(具体的观察者)
下面就直接上代码:
1、先定义抽象主题角色:包括注册观察者和移除观察者,以及通知观察者
package com.hd.observer; public interface Observable { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyAllObservers(); }
2、具体观察者
package com.hd.observer; import java.util.ArrayList; import java.util.List; public class WechatServer implements Observable { private List<Observer> observers = new ArrayList<Observer>(); private String msg; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyAllObservers() { for(Observer observer: observers){ observer.update(msg); } } public void setInformation(String msg){ System.out.println("wechat push message: "+ msg); this.msg = msg; notifyAllObservers(); //状态改变的时候,同时触发通知观察者 } }
3、抽象观察者。 它会有一个update方法,用来接收主题角色的通知
package com.hd.observer; public interface Observer { void update(String msg); //接收主题角色的通知 }
4、具体的观察者
package com.hd.observer; public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String msg) { System.out.println(name + " receive message: " + msg); } }
5、下面测试一下:
package com.hd.observer; public class TestObserver { public static void main(String[] args) { ConcreteObserver o1 = new ConcreteObserver("jack"); ConcreteObserver o2 = new ConcreteObserver("jet"); ConcreteObserver o3 = new ConcreteObserver("tony"); WechatServer server = new WechatServer(); server.registerObserver(o1); server.registerObserver(o2); server.registerObserver(o3); server.setInformation("java is the world best language");
System.out.println("------------------------------");
server.removeObserver(o1); server.setInformation("python is the world best language"); } }
看下测试结果:
wechat push message: java is the world best language jack receive message: java is the world best language jet receive message: java is the world best language tony receive message: java is the world best language ------------------------------ wechat push message: python is the world best language jet receive message: python is the world best language tony receive message: python is the world best language
未完待续。。。
以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)