Java设计模式之观察者设计模式
2016-05-24 11:47
351 查看
概述
观察者设计模式, 它定义了一种一对一或者一对多的依赖关系,让多个观察者同时监听某一个主体对象,当这个对象发生变化时,会通知所有观察者对象,使他们能够自动更新自己。通俗点说就是,当被观察者对象发生变化时,所有观察他的人即所有观察者都会被通知到,然后观察者根据返回的数据进行相应操作。解决的问题
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。模式中的角色
抽象主题(Subject)它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject)
将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Observer)
为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteObserver)
实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
代码实现
1, 抽象主题subject,定义一个通知所有观察者方法public interface Subject { void notifyFighter(); }
2, 具体主题将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
public class FangxueLe implements Subject { //存放所有观察者对象,也可以是一个观察者对象 private int msg; public FangxueLe(int msg){ this.msg = msg; } public void setMsg(int msg){ this.msg = msg; } List<RoleObserver> list = new ArrayList<>(); public void addRoleObserver(RoleObserver o){ list.add(o); } public void removeRoleObser(RoleObserver o){ list.remove(o); } public void notifyFighter(){ for (int i = 0; i < list.size(); i++) { list.get(i).update(msg); } } }
3, 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
public interface RoleObserver { void update(int msg); }
4, 具体观察者(RoleA 、RoleB ):
public class RoleA implements RoleObserver{ @Override public void update(int msg) { if (msg == 0) { System.out.println("A : 再等等 ,他还没下课"); } else if (msg == 1) { System.out.println("A : 小贱下课了 抄家伙"); } } } public class RoleB implements RoleObserver{ @Override public void update(int msg) { if (msg == 0) { System.out.println("B : 快点走 他快要下课了"); } else if (msg == 1) { System.out.println("B : 快 他下课了 要挨揍。去帮忙"); } } }
测试类代码如下:
public static void main(String[] args) { FangxueLe f = new FangxueLe(0); RoleObserver a = new RoleA(); RoleObserver b = new RoleB(); f.addRoleObserver(a); f.addRoleObserver(b); f.notifyFighter(); //msg为0时的反应 f.setMsg(1); //msg为1时的反应 f.notifyFighter(); }
注:
一般用于被观察者状态发生变化时,和其有关的观察者收到这个变化的信息并作出及时处理,通常这个语法我们也叫接口回调,是开发过程中非常实用的一个技能
致谢 - 威哥
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序