观察者模式分析、结构图及基本代码



定义:观测者模式定义了一种一对多的依赖关系,让多个观测者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观测者对象,使它们能够自动更新自己。

结构图:

Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观测者。

Observe类,抽象观测者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个Update()方法,这个方法叫做更新方法。

ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色常用一个具体子类实现。

ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状体相协调。具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。

特点:观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。

适用地方:当一个对象的改变不要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

不足:“抽象通知者”还是依赖“抽象通知者”,也就是说,万一没有了抽象观察者这样的接口,我这通知的功能就完不成了。另外就是每个具体观察者,它不一定是‘更新’的方法就调用,就像刚才说的,我希望的是‘工具箱’是隐藏,‘自动窗口’是打开,这根本就不是同名的方法。这应该就是不足的地方吧。

委托的相关知识:

委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将带便一个具体的函数。

一个委托可以搭载多个方法,所有方法被依次唤醒。更重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。委托对象所搭载的所有方法必须具有相同的原型和形式,也就是拥有相同的参数列表和返回值类型。

基本代码:

using System;

using System.Collections.Generic;

using System.Text;

namespace 观察者模式

{

class Program

{

static void Main(string[] args)

{

ConcreteSubject s = new ConcreteSubject();

s.Attach(new ConcreteObserver(s, "X"));

s.Attach(new ConcreteObserver(s, "Y"));

s.Attach(new ConcreteObserver(s, "Z"));

s.SubjectState = "ABC";

s.Notify();

Console.Read();

}

}

abstract class Subject

{

private IList<Observer> observers = new List<Observer>();

//增加观察者

public void Attach(Observer observer)

{

observers.Add(observer);

}

//移除观察者

public void Detach(Observer observer)

{

observers.Remove(observer);

}

//通知

public void Notify()

{

foreach (Observer o in observers)

{

o.Update();

}

}

}

//具体通知者

class ConcreteSubject : Subject

{

private string subjectState;

//具体通知者状态

public string SubjectState

{

get { return subjectState; }

set { subjectState = value; }

}

}

abstract class Observer

{

public abstract void Update();

}

class ConcreteObserver : Observer

{

private string name;

private string observerState;

private ConcreteSubject subject;

public ConcreteObserver(

ConcreteSubject subject, string name)

{

this.subject = subject;

this.name = name;

}

//更新

public override void Update()

{

observerState = subject.SubjectState;

Console.WriteLine("观察者{0}的新状态是{1}",

name, observerState);

}

public ConcreteSubject Subject

{

get { return subject; }

set { subject = value; }

}

}

}

观察者模式分析、结构图及基本代码,布布扣,bubuko.com

时间: 2024-08-07 16:45:04

观察者模式分析、结构图及基本代码的相关文章

模板方法模式分析、结构图和基本代码

 定义:模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法.这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体方法. ConcreteClass,实现父类所定义的一个或多个抽象方法.每一个AbstractClass都可以有任

迭代器模式分析、结构图及基本代码

定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 适用地方:当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式.或者当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式. 尽管我们不需要显式地引用迭代器,但系统本身还是通过迭代器来实现遍历的.总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据.迭代器模式在访问数组.集合.列表等数据

备忘录模式分析、结构图及基本代码

 定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态.Originator可根据需要决定Memento存储Originator的哪些内部状态. Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento.备忘录

职责链模式分析、结构图与基本代码

?? 定义:使多个对象都有机会处理请求.从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链.并沿着这条链传递该请求,直到有一个对象处理它为止. 优点:当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它.这就使得接收者和发送者都没有对方的明白信息,且链中的对象自己也并不知道链的结构. 结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它全部的候选接收者的引用.这就大大减少了耦合度了.因为式在client来定义链的结

中介者模式分析、结构图及基本代码

 定义:用一个中介对象来封装一系列的对象交互. 中介者使各对象不须要显式地相互引用.从而使其耦合松散,并且能够独立地改变它们之间的交互. 适用地方:中介者模式一般应用于一组对象以定义良好可是复杂的方式进行通信的场合以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合. 长处:中介者的出现降低了各个对象的耦合,使得能够独立地改变和复用各个对象类和中介类,比方不论什么国家的改变不会影响到其它国家,而仅仅是与安理会发生变化.其次,因为把对象怎样写作进行了抽象,将中介作为一个独立的概念并

解释器模式分析、结构图及基本代码

 定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用地:当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题.像正则表达式.浏览器应用等等. 优点是可以很容易地扩展和改变文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文

訪问者模式的分析、结构图及基本代码

 之前我对全部的23种设计模式作了一个小总结.如今我们来对每一种设计模式作具体的分析.首先是訪问者模式: 定义:表示一个作用于某对象结构中的各元素的操作.它可使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用地方:訪问者模式的目的是要把处理从数据结构分离出来.非常多系统能够依照算法和数据结构分开,假设这种系统有比較稳定的数据结构.又有易于变化的算法的话.使用訪问者模式就是比較合适的,由于訪问者模式使得算法操作的添加变得easy. 优缺点:訪问者模式的长处就是添加新的操作非常

适配器模式的分析、结构图及基本代码

 下面说说适配器模式: 定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用地方:在软件开发中,也就是系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 注意:要在双方都不太容易修改的时候再使用适配器模式适配. 开放-封闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但

桥接模式的分析、结构图及基本代码

 昨天探讨了访问者模式,今天来说说桥接模式: 定义:将抽象部分与它的实现部分分离,是它们可以独立地变化. 这并不是说,让抽象类与其派生类分离,因为这没有任何意义.实现指的是抽象类和它的派生类用来实现自己的对象. 理解:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合. 下面讲一下合成/聚合复用原则: 合成/聚合复用原则就是尽量使用合成/聚合,尽量不要使用类继承.聚合表示一种弱的'拥有'关系,体现的是A对象可以包含B对象,但B对象不