设计模式_观察者模式

Observer Pattern

Define a ont-to-many dependency between objects so that when
one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新)

● Subject被观察者

定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类 或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。

● Observer观察者

观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理

public abstract class Subject {
//定义一个观察者数组
private Vector<Observer> obsVector = new Vector<Observer>();
//增加一个观察者
public void addObserver(Observer o){
this.obsVector.add(o);
}
//删除一个观察者
public void delObserver(Observer o){
this.obsVector.remove(o);
}
//通知所有观察者
public void notifyObservers(){
for(Observer o:this.obsVector){
o.update();
}
}
}

例子

监控秦始皇,儒家,墨家,法家都严密监视秦始皇的行动。

public interface Observer {
 public void update(String context);
}
/**
 * 这个接口的存在就是对观察者的统一管理
 * @author suibian
 *
 */
public interface ObserverManage {

 public void addObserver(Observer observer);
 public void deleteObserver(Observer observer);
 public void notifyObservers(String context);
}
/**
 * 被观察者,该有的都有
 * @author suibian
 *
 */
public interface IEmperorQin {
 public void haveLove();
 public void haveUnited();
}
public class EmperorQin implements ObserverManage,IEmperorQin{
 private ArrayList<Observer> observerList=new ArrayList<Observer>();

 /*private Vector<Observer> observerList=new ArrayList<Observer>(); 这样线程安全  */

 public void addObserver(Observer observer) {
  this.observerList.add(observer);
 }
 public void deleteObserver(Observer observer) {
  this.observerList.remove(observer);
 }
 public void notifyObservers(String context) {
  for(Observer ob:observerList){
   ob.update(context);
  }
 }
 public void haveLove() {
  System.out.println("秦始皇开始修阿房宫了");
  this.notifyObservers("秦始皇开始修阿房宫了");
 }
 public void haveUnited() {
  System.out.println("秦始皇已经统一天下了");
  this.notifyObservers("秦始皇已经统一天下了");
 }
}
public class RuJia implements Observer {
 public void update(String context) {
  System.out.println("儒家:看到李斯活动,准备配合");
  this.cry(context);
  System.out.println("儒家配合的好");
 }
 private void cry(String context) {
  System.out.println("儒家根据-》"+context+"制定了计划");
 }
}
public class MoJia implements Observer {
 public void update(String context) {
  System.out.println("墨家:观察到秦始皇活动,自己也开始行动了");
  this.cry(context);
  System.out.println("墨家修好了机关兽");
 }
 private void cry(String context) {
  System.out.println("墨家说,因为-》"+context+"所以我必须马上行动");
 }
}
public class FaJia implements Observer {
 public void update(String context) {
  System.out.println("法家:观察到秦始皇活动");
  this.reportToQinShiHuang(context);
  System.out.println("法家汇报完毕");
 }
 private void reportToQinShiHuang(String context) {
  System.out.println("法家:秦始皇有活动-》"+context);
 }
}
public class QinDynasty {

 public static void main(String[] args) {
  FaJia liSi=new FaJia();
  MoJia wanSi=new MoJia();
  RuJia rujia=new RuJia();

  EmperorQin qinshihuang=new EmperorQin();

  qinshihuang.addObserver(liSi);
  qinshihuang.addObserver(wanSi);
  qinshihuang.addObserver(rujia);

  qinshihuang.haveLove();
  qinshihuang.haveUnited();
 }
}
/*
如果这样设计,的确,订阅模式,但是前提是观察者需要被添加到被观察者的队列中
当被观察者行动时,循环队列,一个一个的调用队列中的提醒方法,也就是说,被观察者必须要知道观察者中的内部结构,
或者说他们俩个达成了某种协议
扩展性不好
代码结构清晰
*/

优点

观察者和被观察者是抽象耦合

触发机制形成了一个触发链

缺点

如果一个观察者卡壳...

使用场景

关联行为

多级触发

跨系统的消息交换

在java中已经有了一个java.util.Observer接口和 java.util.Observable接口,使用这俩个就显得非常简单了。

我是菜鸟,我在路上。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 06:49:45

设计模式_观察者模式的相关文章

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

OO设计模式_观察者模式

Motivation: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”————一个对象(目标对象)的状态发生改变,所有的依赖对象(观察这对象)都将得到通知.如果这样的依赖关系过于紧密,将是软件不能很好的抵御变化. 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. Intent: 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化,所有依赖于它的对象都得到通知并自动更新. Code: 1.不使用设计模式编程. //不使用设

[设计模式]_[观察者模式在项目中实际使用例子]

场景: 1. 比如在界面开发中,多个窗口之间需要通讯,比较常见的方法就是各个窗口之间包含对其他窗口的引用,之后在需要时通过其他窗口的引用来调用相应的函数获取相应的值: 但是这个确定还是比较明显的,就是会造成窗口之间的依赖和耦合,想想测试或变异某个窗口时另一个窗口必须是没问题的,而另一个窗口编译又依赖它,这样成了反复依赖 导致编译不过或修改其中一个另一个就得相应的该.很麻烦,不好维护. 2. 还有的不切实际的解决办法是在窗口之间发送事件,比如qt得信号或win32的消息,但是这样会造成消息的泛滥,

【GOF23设计模式】观察者模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 1 package com.test.observer; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Subject { 7 protected List<Observer> list = new ArrayList<Observer>(); 8 9 p

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

【设计模式】观察者模式

生活中,当某件事发生时,应该通知所有的相关者.例如,上课地点有变,要通知所有学习这门课的同学. 在软件设计中,当一个对象的状态发生变化是,如何通知与它相关的所有对象,就是我们今天要谈到的观察者模式. 观察者模式 概述 定义了一种一对多的依赖关系.让多个观察者对象同事监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己. 实际上,观察者模式所做的工作就是在解除耦合.让耦合的双方都依赖于抽象,而不是依赖于具体.从而使得各自的变化都不会影响另一边的变化. 结

事件(_观察者模式)

一个类如果声明一个Public的委托让其他方法注册,同样也会存在外部直接调用此委托,这样是有会出现莫名的调用风险的.因此就有了事件,事件无法在外部直接调用.外部只有注册(定阅).内部进行发布. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 事件_观察者模式_ { class Program {

设计模式:观察者模式

设计模式:观察者模式 : http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html 观察者模式是我们经常用的一个模式,比如在用wcf做服务的时候通知客户端做一些操作一般用设计者模式. 今天做一个订报纸的小例子来理解一下观察者模式  出版者+订阅者=观察者模式 用下边的图来说就是    人民日报+订阅者=观察者模式 只要是订阅了人民日报的人,有了新报纸就会送到订阅者那里去, 当你不想订的时候取消就不订阅就不会再收到报纸了. //报

设计模式之-观察者模式

该文代码来自设计模式之惮一书. 观察者模式定义: 观察者模式也叫做发布订阅模式. 观察者模式中的角色: 1.被观察者 被观察者职责为管理观察者并通知观察者. 2.观察者 对接受到的消息进行处理. /// <summary> /// 被观察者 /// </summary> public abstract class Subject { /// <summary> /// 观察者集合 /// </summary> private List<IObserva