设计模式(13)---观察者模式

观察者模式  Observer(行为型模式)

1.概述

观察者模式:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

例1:开车的司机作为观察者,路上的红绿灯作为观察目标,当红绿灯的颜色状态发生改变时,司机得到通知,并更新自己的行为。

例2:一个能够显示商品信息的页面,当数据库的关于商品的信息发生改变时,页面的信息也会发生相应的改变。

2.结构图

3.代码

代码简述:玩魔兽争霸这类游戏时,队友遭到敌人攻击,地图上会有红色标记提示,其他队友作为观察者,更新自己的状态,前去支援。

 1 import java.util.ArrayList;
 2
 3 /*
 4  * 抽象观察目标类
 5  */
 6 public abstract class Subject {
 7
 8     //存储所有具体的观察者
 9     protected ArrayList<Observer> players = new ArrayList<Observer>();
10     public Subject() {
11
12     }
13
14     //加入方法
15     public void attach(Observer obs) {
16         System.out.println(obs.getName() + "加入");
17         players.add(obs);
18     }
19
20     //退出方法
21     public void detach(Observer obs) {
22         System.out.println(obs.getName() + "退出");
23         players.remove(obs);
24     }
25
26     //声明抽象通知方法
27     public abstract void notify(String name);
28
29 }
 1 /*
 2  * 具体观察目标类
 3  */
 4 public class ConcreteSubject extends Subject {
 5
 6     public ConcreteSubject() {
 7         // TODO Auto-generated constructor stub
 8     }
 9
10     @Override
11     public void notify(String name) {
12         //遍历观察者集合,调用每一个观察者(自己除外)的更新方法
13         for(Object obs : players) {
14             if (!((Observer)obs).getName().equalsIgnoreCase(name)) {
15                 ((Observer)obs).update();
16             }
17         }
18
19     }
20
21 }
 1 /*
 2  * 抽象观察者
 3  */
 4 interface  Observer {
 5
 6     public String getName();
 7     public void setName(String name);
 8     public void update();
 9     public void beAttacked(Subject s);
10
11 }
 1 /*
 2  * 具体观察者
 3  */
 4 public class ConcreteObserver implements Observer {
 5
 6     private String name;
 7     public ConcreteObserver(String name) {
 8         this.name = name;
 9     }
10     @Override
11     public String getName() {
12         return this.name;
13     }
14     @Override
15     public void setName(String name) {
16         this.name = name;
17
18     }
19
20     //更新自己的状态
21     @Override
22     public void update() {
23         System.out.println(name+"前去支援");
24
25     }
26
27     @Override
28     public void beAttacked(Subject s) {
29         System.out.println(name+"遭到攻击");
30         s.notify(this.name);
31
32     }
33
34 }
 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         ConcreteSubject s = new ConcreteSubject() ;
 5
 6         Observer o1,o2,o3 ;
 7         o1 = new ConcreteObserver("A队员");
 8         o2 = new ConcreteObserver("B队员");
 9         o3 = new ConcreteObserver("C队员");
10
11         s.attach(o1);
12         s.attach(o2);
13         s.attach(o3);
14
15         o1.beAttacked(s);
16
17     }
18
19 }

4.适用场景

(1)一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。

(2)一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使各自的变化都不会影响到另一边的变化。

时间: 2024-08-14 16:28:26

设计模式(13)---观察者模式的相关文章

设计模式(16) 观察者模式(OBSERVER)C++实现

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 动机: 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一致性. 观察者模式定义一种交互,即发布-订阅: 一个对象当自身状态发生改变时,会发出通知,但是并不知道谁是他的接收者,但每个接收者都会接收到通知,这些接受者称为观察者. 作为对通知的响应,每个观察者都将查询目标状态,然后改变自身的状态以和目标状态进行同步. 使用场景: 使对象封装为独立的改变和使用:

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

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

常用设计模式之观察者模式 + 事件委托

常用设计模式之观察者模式 + 事件委托 作用及UML (摘自<大话设计模式>) Code 1 abstract class Subject{ 2 protected String state; 3 public void setState(String state){this.state = state;} 4 public String getState(){return this.state;} 5 6 private List<Observer> observers = ne

设计模式之观察者模式(Observer)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 1 ——观察者模式

设计模式目录: 设计模式 1 ——观察者模式 一.基本定义 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新. 在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者.一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展. 观察者模式又称为发布-订阅模式. 二.基本结构 首先先看观察者模式的UML类图. 分析: Subject:目标.他把所有

C#设计模式(17)——观察者模式(Observer Pattern)

原文:C#设计模式(17)--观察者模式(Observer Pattern) 一.引言 在现实生活中,处处可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用.在这一章将分享我对观察者模式的理解,废话不多说了,直接进入今天的主题. 二. 观察者模式的介绍 2.1 观察者模式的定义 从生活中的例子可以看出,只要对订阅号进行关注的客户端,如果订阅号有什么更新,就会直接推送给订阅了的用户.从中,我们就可以得出观察者模式的定义. 观察者模式定义了一种一对多的依赖

【设计模式】观察者模式

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

设计模式:观察者模式

设计模式:观察者模式 : 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

&lt;&lt;Head First设计模式&gt;&gt;之观察者模式学习

1.概念 定义了对象之间的一对多依赖关系,当一个对象(主题对象)的状态改变时,它的所有依赖者(观察者对象)都会收到通知并自动更新. 2.优势 观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需修改主题对象的代码,只需要新的观察者对象实现接口.在程序运行的过程中,可以随时注册和删除观察者而不影响主体对象. 观察者模式使主题(Subject)对象和观察者(Observer)对象都可以被轻易地复用. 3.Java中观察者模式 Java API有内置的观察者模式,java.util