設計模式觀察者模式

觀察者用例圖

代碼

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; }

}

}

时间: 2024-10-28 14:26:18

設計模式觀察者模式的相关文章

JavaScript-观察者模式(publish/subscribe)

JavaScript-观察者模式(publish/subscribe) 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象.它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称. 在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持.在JavaScript中事

VR廣告設計與商業

<VR廣告設計與商業>培訓營 課程 By 高煥堂/台灣VR產業聯盟 主席  2016.11月 在Buy+購物的浪潮下,<VR廣告製作>也水漲船高,歡迎您一起來學習VR廣告製作技術. 進入無框世界 我們知道,傳統多媒體大多給觀眾圈定了一個"框",例如TV建構了一個有框世界,讓人們從框外觀看框裡的節目.而VR技術則打破了傳統螢幕的"框",引導人們進入螢幕的框內,給予一個完整的世界.在廣告方面,從"有框"到"無框&qu

這個日曆戳一下,一天就往時了|這個設計了不得

俺們每日都為你舉薦幾個最近察覺的好設計.「這個設計了不得」的微信市民號上線啦,直爽搜new balance 580查「BestDesign」或者「Qthings」就能夠訂閱,留意俺們每天發覺的新奇好設計.Buzzifloat by Alain Gilles更少的原料體現著未有足夠的安閒度?在吉布提科隆國外工作家倶及裝備展( ORGATEC )上,盧旺達設計師 Alain Gilles 用為家私企業 BuzziSpace 所設計的極簡風座椅 Buzzifloat 給出了否認的解答.座椅的設計靈性出

通過數據了解用戶——數據在新品設計中的應用

通常情況下,我們可以通過用戶訪談的方法了解用戶需求,其實設計師還可以通過分析用戶問卷調查數據以及網站頁面數據等方式,了解用戶需求以及用戶在使用產品時遇到的問題. 而且,直接通過接觸用戶了解到的需求有可能只是個案,為了增強客觀性,通常都會通過大樣本調查,從數據實證的角度,進一步更準確和客觀地找到用戶的普遍需求. 此外,通過對數據分析結果與用戶訪談所得到的定性分析結論,進行比較和綜合分析,設計師也能夠從不同的角度了解用戶的真實需求. 從用研的角度來看,交互設計包括新產品設計以及已有產品的改版設計兩大

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op

MVC+EF 理解和实现仓储模式和工作单元模式

MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generic Repository in ASP.NET MVC using Entity Framework 文章介绍 在这篇文章中,我们试着来理解Repository(下文简称仓储)和Unit of Work(下文简称工作单元)模式.同时我们使用ASP.NET MVC和Entity Framework 搭

JAVA的模式对话框和非模式对话框

周末的时候,一位网友让我帮他把他的无模式对话框改成有模式对话框. 界面是有swing制作的,都是JFrame,我从来没有接触过swing编程.大致的代码还是看的懂,很多都和C#很相似. 然后就去查资料,JAVA的模式对话框是如何调用的.终于查到了需要用到JDialog类,JDialog的构造函数里可以指定是否是模式对话框. 1 public JDialog(Frame owner, String title, boolean modal) { 2 super(owner == null? Swi

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

模式窗口和非模式窗口

JS弹出模式窗口 和非模式窗口JS弹出模式窗口 一般来说,显示在最前面的窗口都是因为被激活获得焦点,要是窗口永远显示在最前面, 可以人为的设置窗口在blur时立刻focus,或者用模式.无模式对话框实现. 具体步骤  方法一:弹出窗口<body>里加上代码:onblur="self.focus()":      <body onblur="self.focus()">  方法二:用showModelDialog方法简历模式对话框,他的参数说明