设计模式之观察者模式
2016-07-07 19:08
155 查看
一、什么是观察者模式
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
二、观察者设计模式类图
观察者:(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
一、实例浅析观察者设计模式
/*
* 观察者设计模式:创建观察者抽象接口和被观察者抽象接口,创建观察者具体类实现观察者抽象接口
* 创建被观察者具体类实现被观察者抽象接口,观察者对应的被观察者有很多个,因此观察者需要创建
* 一个容器来存放被观察者。
* 不想太官方,简单点就是一个类的对象拥有很多个其他的同类的对象,并把这些对象都放在自己的
* 管辖区域内(自己的容器),需要的时候(需要调用某个方法实现某项行为或功能的时候)
* 就遍历这个容器做到同时全部的管理。想一想,好像就这样哟,哈哈。
*/
观察者抽象接口的创建
package WatcherModel;
import java.util.ArrayList;
/*
* 观察者抽象类
*/
public interface Observer {
//可以自定义各种方法
public void addOne(BeObservered beObservered);
public void removeOne(BeObservered beObservered);
public String sendMessage(String message);
}
被观察者抽象接口的创建
package WatcherModel;
/*
* 被观察者抽象类
*/
public interface BeObservered {
//自定义各种方法
public void receivemessage(String message);
}
观察者具体类
package WatcherModel;
import java.util.ArrayList;
/*
* 观察者具体类,实现观察者抽象接口
*/
public class Boss implements Observer {
// 一个观察者对应多个被观察者,即一个Boss对应多个Worker
// 需要个容器来装被观察者
ArrayList<BeObservered> list = new ArrayList<BeObservered>();
public void addOne(BeObservered beObservered) {
list.add(beObservered);
}
// 从list中移除当前的对象
public void removeOne(BeObservered beObservered) {
list.remove(beObservered);
}
public void sendMessage() {
String message = "明天放假!";
// 遍历list,调用每个被观察者对象的方法
for (int i = 0; i < list.size(); i++) {
list.get(i).receivemessage(message);
}
}
public String sendMessage(String message) {
return null;
}
}
被观察者具体类
测试类
运行结果
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
二、观察者设计模式类图
观察者:(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
一、实例浅析观察者设计模式
/*
* 观察者设计模式:创建观察者抽象接口和被观察者抽象接口,创建观察者具体类实现观察者抽象接口
* 创建被观察者具体类实现被观察者抽象接口,观察者对应的被观察者有很多个,因此观察者需要创建
* 一个容器来存放被观察者。
* 不想太官方,简单点就是一个类的对象拥有很多个其他的同类的对象,并把这些对象都放在自己的
* 管辖区域内(自己的容器),需要的时候(需要调用某个方法实现某项行为或功能的时候)
* 就遍历这个容器做到同时全部的管理。想一想,好像就这样哟,哈哈。
*/
观察者抽象接口的创建
package WatcherModel;
import java.util.ArrayList;
/*
* 观察者抽象类
*/
public interface Observer {
//可以自定义各种方法
public void addOne(BeObservered beObservered);
public void removeOne(BeObservered beObservered);
public String sendMessage(String message);
}
被观察者抽象接口的创建
package WatcherModel;
/*
* 被观察者抽象类
*/
public interface BeObservered {
//自定义各种方法
public void receivemessage(String message);
}
观察者具体类
package WatcherModel;
import java.util.ArrayList;
/*
* 观察者具体类,实现观察者抽象接口
*/
public class Boss implements Observer {
// 一个观察者对应多个被观察者,即一个Boss对应多个Worker
// 需要个容器来装被观察者
ArrayList<BeObservered> list = new ArrayList<BeObservered>();
public void addOne(BeObservered beObservered) {
list.add(beObservered);
}
// 从list中移除当前的对象
public void removeOne(BeObservered beObservered) {
list.remove(beObservered);
}
public void sendMessage() {
String message = "明天放假!";
// 遍历list,调用每个被观察者对象的方法
for (int i = 0; i < list.size(); i++) {
list.get(i).receivemessage(message);
}
}
public String sendMessage(String message) {
return null;
}
}
被观察者具体类
package WatcherModel; /* * 被观察者的具体类,实现被观察者抽象接口 */ public class Worker implements BeObservered { public void receivemessage(String message) { System.out.println(message); } }
测试类
package WatcherModel; public class Test { public static void main(String[] args) { Boss boss = new Boss(); Worker worker1 = new Worker(); Worker worker2 = new Worker(); Worker worker3 = new Worker(); Worker worker4 = new Worker(); boss.addOne(worker1); boss.addOne(worker2); boss.addOne(worker3); boss.addOne(worker4); boss.sendMessage(); } }
运行结果
相关文章推荐
- 二维码生成器
- 网络爬虫技术
- LVM扩展LV ubuntu
- java泛型
- hdu5360(优先队列)
- 安装laravel及其初步使用
- python urllib库使用
- 是这么设计Android项目架构的
- Struts2学习之常用配置及action接收参数
- 代理模式浅析
- file.encoding到底指的是什么呢?
- [转]linux shell数据重定向(输入重定向与输出重定向)详细分析
- Android来电监听和去电监听
- 心得篇
- PHP面向对象总结
- android屏幕适配
- 一步一步演示神经网络回馈算法过程
- Spring IOC理解
- [机器学习笔记]Note8--机器学习应用建议
- 企业生产环境集群稳定性-HA就行吗?