`

常用设计模式----观察者模式

 
阅读更多
观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

设计原则:
为了交互对象之间的松耦合设计而努力。


java中内置的观察者模式:
java.util.Observer(接口)和java.util.Observable(类,这也正是其局限性,不能有效的扩展(比如已经extends其他类的情况下))
--------------------------
以下是对util中的Observable的改进:
//抽象出一层
public interface IObservable {
    //注册观察者
    void addObserver(Observer o);
    //取消注册
    void deleteObserver(Observer o);
    //通知观察者们(拉的形式)
    void notifyObservers();
    //推的形式
    void notifyObservers(Object arg);
}

//可观察者对象的实现
class Observable implements IObservable{
 private boolean changed = false;
 private List<Observer> obs;

 public Observable() {
  obs = new ArrayList<Observer>();
 }
 public synchronized void addObserver(Observer o) {
  if (o == null)
   throw new NullPointerException();
  if (!obs.contains(o)) {
   obs.add(o);
  }
 }

 public synchronized void deleteObserver(Observer o) {
  obs.remove(o);
 }

 public void notifyObservers() {
  notifyObservers(null);
 }
 public void notifyObservers(Object arg) {
  Object[] arrLocal;

  synchronized (this) {
   if (!changed)
    return;
   arrLocal = obs.toArray();
   clearChanged();
  }

  for (int i = arrLocal.length - 1; i >= 0; i--)
   ((Observer) arrLocal[i]).update(this, arg);
 }

 public synchronized void deleteObservers() {obs.clear();}
 protected synchronized void setChanged()   {changed = true;}
 protected synchronized void clearChanged() {changed = false;}
 public synchronized boolean hasChanged()   {return changed;}
 public synchronized int countObservers()   {return obs.size();}
}

//观察者需要实现统一的接口
interface IObserver {
    void update(IObservable o, Object arg);
}

//观察者实现类
class Observer implements IObserver {
 private IObservable obs;

 public Observer(IObservable obs) {
  this.obs = obs;
  obs.addObserver(this);
 }

 @Override
 public void update(IObservable o, Object arg) {
  //观察者自己的更新方法
        //...
 }
}

//新建一个主题对象,传递到新建的观察者对象中。调用主题对象的notify 就会触发观察者对象了。


-观察者模式定义了对象之间的一对多的关系。
-主题(也就是可观察者)用一个共同的接口来更新观察者。
-观察者和可观察者(主题)之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
-使用该模式时,可以从被观察者处推(push)或拉(pull)数据(不过,推的方式比较推崇)。
-有多个观察者时不可以依赖特定的通知次序。
-Java有多种观察者模式的实现,包括通用的java.util.Observalbe。
-许多UI框架比如SWT等的添加监听器的行为 都是观察者模式的实现。
分享到:
评论

相关推荐

    java常用设计模式-观察者模式

    java常用设计模式-观察者模式

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

    java常用23中设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    Java常用设计模式

    Java的一些常用设计模式,包括单例模式、门面模式、策略模式、观察者模式、建造者模式、简单工厂模式、抽象工厂模式、工厂方法模式、代理模式、动态代理模式,适合初学者掌握

    常用设计模式demo代码-design.rar

    1、单例模式 2、工厂模式(简单工厂、工厂方法、抽象工厂) 3、观察者模式 4、模板模式

    Jjava常用设计模式

    Java常用的设计模式详解,包含: 1、单例模式 2、工厂模式 3、策略模式 4、观察者模式 等等模式……

    java中的设计模式,主要的设计模式

    适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式观察者模式、策略模式、模板模式、责任链模式、解析器模式、迭代子模式 命令模式、状态模式、备忘录模式、访问者模式、中介者模式

    Java常用设计模式例子

    以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    java 三种设计模式Demo 其中对单例模式做了详细的讲解,及性能和线程安全方面的优化其中Singleton.java为经典单例模式。

    常用设计模式学习脑图

    常用设计模式脑图,脑图中根据每个设计模式进行了详细的备注解释!我们的最强大脑在哪里?在这里!(单例模式、原型模式、工厂模式、代理模式、策略模式、适配器模式、委派模式、装饰器模式、观察者模式)

    观察者模式源码

    日常开发中常用的行为型设计模式之观察者模式设计源码demo

    Java内置观察者模式

    观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的...

    观察者设计模式笔记

    031114_【第11章:Java常用类库】_观察者设计模式笔记

    Java EE设计模式:Spring企业级开发最佳实践

    在 Spring 中,观察者模式广泛应用于事件驱动编程中,例如,在 Spring MVC 中,使用观察者模式来处理请求和响应。 4.MVC Pattern:模型视图控制器模式,分离应用程序的关注点,实现高内聚、低耦合的设计。 在 ...

    常用设计模式java实现

    策略模式、观察者模式、装饰模式、适配器模式、单例模式、工厂方法模式、门面模式,java语言实现的例子。

    java常用设计模式

    工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式都是比较常用的,不同的项目有不同的设计方向,可以参考的设计模式也不尽相同,没有定数,只是上面这几个...

    java 观察者模式 demo

    开发中常用 设计模式 开发者模式,欢迎大家学习。 博客:http://blog.csdn.net/q610098308/article/details/76143959

    12种常用设计模式代码实现

    包含策略模式、抽象工厂模式、代理模式、单例模式、工厂方法、观察者模式 静态工厂方法、命令模式、适配器模式、外观模式、原型模式、组合模式

    java设计模式学习文档.pdf

    培养学生掌握简单工厂模式、工厂方法模式、单例模式、原型模式、桥接模式、适配器模式、装饰模式、代理模式、命令模式、观察者模式等常用设计模式的设计思想,并掌握在实际软件工程领域中的运用,能够把所学的原理...

Global site tag (gtag.js) - Google Analytics