- 浏览: 28484 次
- 性别:
- 来自: 北京
文章分类
最新评论
原摘取至百度百科
简介:
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
实现方式:
观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。
原理:
事件,也就是观察者与被观察者解耦,一定程度上分离开来(本质上是针对接口的编程,而不是针对实现的编程)
[img]
[/img]
实现过程:
注册——通知——撤销注册
如图:
[img]
[/img]
观察者:
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
使用场景:
同一个发生源,需要针对不同事件类型做出不同的判断处理。
同一个发生源,同一种事件类型,需要不同的处理方式。
简介:
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
实现方式:
观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。
原理:
事件,也就是观察者与被观察者解耦,一定程度上分离开来(本质上是针对接口的编程,而不是针对实现的编程)
[img]
[/img]
实现过程:
注册——通知——撤销注册
如图:
[img]
[/img]
观察者:
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
使用场景:
同一个发生源,需要针对不同事件类型做出不同的判断处理。
同一个发生源,同一种事件类型,需要不同的处理方式。
//观察者,需要用到观察者模式的类需实现此接口 public interface Observer{ void update(Object...objs); } //被观察者(一个抽象类,方便扩展) public abstract class Observable{ public final ArrayList<Class<?>> obserList = new ArrayList<Class<?>>(); /**AttachObserver(通过实例注册观察者) *<b>Notice:</b>obcan'tbenull,oritwillthrowNullPointerException **/ public<T> void registerObserver(T ob){ if(ob==null) throw new NullPointerException(); this.registerObserver(ob.getClass()); } /** *AttachObserver(通过Class注册观察者) *@paramcls */ public void registerObserver(Class<?> cls){ if(cls==null) throw new NullPointerException(); synchronized(obserList){ if(!obserList.contains(cls)){ obserList.add(cls); } } } /**UnattachObserver(注销观察者) *<b>Notice:</b> *<b>ItreverseswithattachObserver()method</b> **/ public<T>void unRegisterObserver(Tob){ if(ob==null) throw new NullPointerException(); this.unRegisterObserver(ob.getClass()); } /**UnattachObserver(注销观察者,有时候在未获取到实例使用) *<b>Notice:</b> *<b>ItreverseswithattachObserver()method</b> **/ public void unRegisterObserver(Class<?>cls){ if(cls==null) throw new NullPointerException(); synchronized(obserList){ Iterator<Class<?>>iterator=obserList.iterator(); while(iterator.hasNext()){ if(iterator.next().getName().equals(cls.getName())){ iterator.remove(); break; } } } } /**detachallobservers*/ public void unRegisterAll(){ synchronized(obserList){ obserList.clear(); } } /**Ruturnthesizeofobservers*/ public int countObservers(){ synchronized(obserList){ returnobserList.size(); } } /** *notify all observer(通知所有观察者,在子类中实现) *@paramobjs */ public abstract void notifyObservers(Object... objs); /** *notify one certain observer(通知某一个确定的观察者) *@paramcls *@paramobjs */ public abstract void notifyObserver(Class<?> cls, Object... objs); /** *notifyonecertainobserver *@paramcls *@paramobjs */ public abstract<T> void notifyObserver(T t, Object... objs); } //目标被观察者 public class ConcreteObservable extends Observable{ private static ConcreteObservableinstance = null; private ConcreteObservable(){}; public static synchronized ConcreteObservablegetInstance(){ if(instance == null){ instance=newConcreteObservable(); } returninstance; } @Override public <T> void notifyObserver(T t, Object... objs){ if(t == null) throw new NullPointerException(); this.notifyObserver(t.getClass(), objs); } @Override public void notifyObservers(Object... objs){ for(Class<?>cls : obserList){ this.notifyObserver(cls, objs); } } //通过java反射机制实现调用 @Override public void notifyObserver(Class<?>cls, Object...objs){ if(cls == null) throw new NullPointerException(); Method[] methods = cls.getDeclaredMethods(); for(Method method : methods){ if(method.getName().equals("update")){ try{ method.invoke(cls,objs); break; }catch(IllegalArgumentException e){ e.printStackTrace(); }catch(IllegalAccessException e){ e.printStackTrace(); }catch(InvocationTargetException e){ e.printStackTrace(); } } } } } //使用(实现Observer接口) public class Text extends Activity implements Observer{ publicvoidonCreate(...){ ConcreteObservable.getInstance().registerObserver(Text.class); .... } //实现接口处理 publicvoidupdate(Object...objs){ //做操作,比如更新数据,更新UI等 } }
发表评论
-
设计模式之——靠谱的单例模式
2017-10-31 23:44 447修改了一下,还是推一下吧,以前工作中见过很多单例都是存在些 ... -
设计模式之——抽象工厂模式
2017-10-29 23:05 429转载至http://blog.csdn.net/jason05 ... -
设计模式之——简单工厂模式
2017-10-28 04:13 314就是建立一个工厂 ... -
设计模式之——装饰者模式
2017-10-22 22:23 333装饰者模式要点: 1. 装饰着与被装饰者拥有共同 ... -
设计模式之——策略模式
2017-10-16 20:29 456关于设计模式推荐《Head First 设计模式》 第一次感觉 ... -
静态内部类与非静态内部类的区别
2017-07-20 23:23 512今天看到一本书中举例使用了,静态内部类, 不是太了解 ... -
JAVA自定义注解(一)
2017-07-12 19:26 465java中元注解有四个: ... -
线程的三种实现方式
2015-05-31 13:13 1528Java线程的三种实现方式: 大家通常了解的是Thread类与 ... -
JDK的动态代理
2015-05-29 00:49 385直接贴代码了, 先理解 ... -
JAVA守护线程
2015-05-20 22:10 561一直以为守护线程,是一个线程对另一个线程的守护(一个服务线 ... -
ReenTrantLock 与synchronized的区别与使用
2015-05-19 21:41 436java锁就Lock与synchronized两种,Ree ... -
经典容器 数组/链表/队列/散列表/映射表,及相关内容的排序方式
2015-05-07 01:13 635Java 经典容器 数组/链表/队列/散列表/映射表,及相 ... -
for(int i=0;i<list.size;i++) 循环为什么慢
2015-05-03 12:32 1701链表循环使用(for int i=0;i<list. ... -
数组与ArrayList
2015-05-03 00:03 498首先纠正 ... -
java泛型学习笔记
2015-04-28 22:59 1799写这个博文的目的:1.校验自己的学习成果的不足,与错误的地 ...
相关推荐
对应的博客链接:http://blog.csdn.net/t1234xy4/article/details/52432559#
Java设计模式——观察者模式的两种情况。
浅析Java设计模式【1】——观察者!
简单易懂的观察者模式
KWIC 程序示例 事件风格 观察者模式的程序代码,使用的是Java语言。
从中,我们就可以得出观察者模式的定义。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为...
《Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况》 示例代码
《Android 设计模式:(一)观察者模式 —— 封装行为的大局观》示例代码
NULL 博文链接:https://quicker.iteye.com/blog/604969
NULL 博文链接:https://quicker.iteye.com/blog/605988
16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. ...
对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...
《java设计模式》课后习题及模拟试题答案
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI具有易变...
22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...
设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
本书从一个新的视角描述面向对象设计,将...\r\n 如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。\r\n 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...