设计模式之观察者模式
2016-07-26 18:06
197 查看
观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
角色:
抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;
具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
Java自带的观察者模式:
自己设计的一种观察者模式:
实体类:用来传递消息
抽象的观察者类
抽象的主题类
具体的观察者类
具体的主题类
测试类
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
角色:
抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;
具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
Java自带的观察者模式:
import java.util.Observable; // 主题角色 通知 观察者 我发生了改变 public class ThemeRole extends Observable{ public static void main(String[] args) { ThemeRole t = new ThemeRole(); ObserverRole o = new ObserverRole(); MyInter o_2 = new MyInter(); t.setChanged(); t.addObserver(o); t.addObserver(o_2); t.notifyObservers("我是主题角色"); } }
import java.util.Observable; import java.util.Observer; /* * 观察者角色 */ public class ObserverRole implements Observer{ // 更新方法 @Override public void update(Observable o, Object arg) { System.out.println("update:"+arg); } }
import java.util.Observable; import java.util.Observer; /** *观察者角色 */ public class MyInter implements Observer{ @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub System.out.println("MyInter:"+arg); } }
自己设计的一种观察者模式:
实体类:用来传递消息
public class Bean { private String name; public Bean(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
抽象的观察者类
public interface Look { void getMessage(Bean bean); }
抽象的主题类
public interface Looked { void addLook(Look look); void removeLook(Look look); void notifyMessage(Bean bean); }
具体的观察者类
public class MyLook implements Look{ @Override public void getMessage(Bean bean) { // TODO Auto-generated method stub System.out.println(bean.getName()); } }
具体的主题类
import java.util.ArrayList; import java.util.List; public class MyLooked implements Looked{ List<Look> list_look = new ArrayList<Look>(); @Override public void addLook(Look look) { // TODO Auto-generated method stub list_look.add(look); } @Override public void removeLook(Look look) { // TODO Auto-generated method stub list_look.remove(look); } @Override public void notifyMessage(Bean bean) { // TODO Auto-generated method stub for(Look lo:list_look){ lo.getMessage(bean); } } }
测试类
public class Test { public static void main(String[] args) { MyLook m = new MyLook(); MyLooked med = new MyLooked(); med.addLook(m); Bean bean = new Bean("测试"); med.notifyMessage(bean); } }
相关文章推荐
- 安卓学习笔记---RecyclerView的五大开源项目-解决办法
- OC数据持久化
- react listview最上方空白
- Android中ViewFlipper的使用详解
- Luence
- C#连接mysql数据库
- 服务器硬件及其操作系统基础
- hdu5733内切球
- 机器学习与R之支持向量机svm(上)
- TiDB 集群安装
- 常用正则表达式
- 微服务架构的优势与不足
- jsoup爬取百度瀑布流图片
- iOS FMDB保存图片
- 项目的开发 -- 互联网+
- 正则表达式(regular expression)以及常用语法
- JQ中的attr和prop方法
- linux中如何查看日志中某个异常出现的次数
- Flask 小白开始
- hdu 5750 Dertouzos (素数+数学)