`

【设计模式】把风放哨,防老板 --- 观察者模式

 
阅读更多

一,概述

观察者<Observer>模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

二,示例

题目描述:公司里有的员工偷懒,看股票,看NBA。老板回来需要有人通知他们,然后再好好干活。通知大家的任务交给前台。

1)双向耦合的代码(读此代码之前先看两个类互相包含

缺点:前台通知类和看股票者相互耦合。如果再想增加一个看NBA的类就违反“开放-- 封闭原则”

StockObserver.h类()



Secretary.h




main.cpp(客户端程序)


2)解除耦合实践一:(C#)

增加了抽象的观察者,方便扩展各种类型的扩展者。


3)解除耦合实践二:(C#)

改进:由于老板来了会自己通知职员,前台也可以偷偷通知职员老板来了。所以增加一个通知者接口。


三,观察者模式

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

观察者基本代码:抽象通知者类,具体实现通知者类,抽象观察者类,具体实现观察者类

抽象通知者为具体实现者父类,负责通知注册的观察者类



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


四,观察者模式的特点

问题:

1)将一个系统分割成一系列相互协作的类有一个不好的副作用:需要维护相对对象的一致性

2)我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便

观察者优点:

1)让耦合的双方都依赖于抽象,而不是依赖于具体。抽象不变,具体会变化



分享到:
评论

相关推荐

    -(小学音乐教案)三年级上册《儿童团放哨歌》教案.pdf

    -(小学音乐教案)三年级上册《儿童团放哨歌》教案.pdf

    java实现事件委托模式的实例详解

    事件委托模式是一种设计模式,它允许对象在不知道对方的存在的情况下进行通信。 Java 实现事件委托模式的实例详解中,我们主要介绍了如何使用 Java 语言来实现事件委托模式,并提供了一个具体的实例来说明如何实现该...

    二年级音乐下册教案.doc

    教师通过听唱法教授歌曲,并引导学生观察课本图片理解歌词,加强环保意识。 - **教学目标**:让学生富有感情地演唱《大树妈妈》,传达对自然的热爱。 - **教学重难点**:指导学生在演唱中表现出歌曲的情感,尤其是...

    苏少版音乐三上《儿童团放哨歌》课件2

    苏少版音乐三上《儿童团放哨歌》课件2

    野外放哨的士兵背景的军事国防PPT模板

    这是一套野外放哨的士兵背景的军事国防PPT模板。第一PPT模板网提供军事行业幻灯片模板免费下载; 关键词:战场、战争、军队、部队幻灯片模板,国防、军训PowerPoint模板,士兵、特种兵PPT模板,.PPTX格式;

    2016秋青岛版(五四制)科学三上1.3《我们周围的动植物》ppt课件

    - **听觉观察**:通过耳朵聆听动物的叫声或植物被风吹动的声音等。 - **触觉观察**:用手触摸感受动植物的表面质感。 - **嗅觉观察**:用鼻子闻动植物散发出来的气味。 #### 2. 具体实例 - **柳树**:树皮开裂,...

    保安述职报告宣贯.pdf

    【保安述职报告要点解析】 保安述职报告主要涵盖了保安人员在工作中的职责、行为规范、工作流程、个人成长...通过这样的报告,我们可以看到保安工作不仅仅是简单的站岗放哨,而是涉及到诸多细节和专业知识的综合运用。

    小学语文近义词巡查近义词

    这些细微的差别是语文学习者必须注意的地方。 当我们对“巡查”这个词进行近义词的巡查时,我们能够发现一系列与之意义相似的词语。比如“放哨”,它通常指在特定的地点进行警戒,以防止不良事件的发生。放哨往往...

    2021年教师招聘考试题库《教育理论综合知识》必考点带答案解析_39.docx

    在教学实践中,教师可以设计多样化的学习活动,帮助学生更好地进行信息加工,比如通过概念图帮助学生组织知识结构,或者通过小组讨论促进深度学习。 ### 4. 新课程改革精神 **知识点概述:** 新课程改革强调转变...

    个人述职报告锦集九篇.docx

    - **群防群治体系**:建立和完善了基层群防群治组织,通过站岗放哨等形式加强夜间治安防范工作。 - **动态调整**:根据不同季节的特点调整防范措施,确保能够及时有效地应对各种突发情况。 #### 六、矛盾排查与调处...

    的好词好句作文4篇.docx

    例如,“疲乏的月亮躲进了云层休息,只留下几颗星星像是在放哨”,这样的描述不仅营造了一种宁静而略带忧伤的氛围,还能引发读者的情感共鸣。 **技术角度解读**: - **情感计算**:研究如何让计算机理解和模拟人类...

    运输队轨道工安全生产责任制精选.doc

    3. **轨道施工与质量控制**:铺设轨道应严格按照设计要求进行,确保轨道质量符合标准,以保证列车行驶的平稳性和安全性。 4. **轨道维护与故障处理**:轨道工需要定期对轨道进行检查,一旦发现任何问题,如轨距偏移...

    长城导游词600字以上5篇精选.doc

    墙顶宽阔,可并行多辆战车,设有垛口、望口和射击口,专为战争而设计。在城墙每隔一定距离的地方,设置了城台,分为高大的敌楼和与城墙相平的墙台。敌楼用于驻军守望,而墙台则用于巡逻和放哨,确保整个防御体系的...

    《中国少年先锋队队歌》教学设计.doc

    "《中国少年先锋队队歌》教学设计" 本教学设计旨在通过《中国少年先锋队队歌》的教学,激发学生想要成为一名少先队员的渴望及对红领巾的热爱。通过学习《中国少年先锋队队歌》,学生可以感受乐曲雄壮、有力的音乐...

    便捷电脑锁

    更为重要的是,"便捷电脑锁"在锁定状态下能屏蔽系统热键,这意味着即使在锁屏模式下,那些可能会被滥用以关闭或重启电脑的快捷键,如Alt+F4、Ctrl+Alt+Del等,都变得无效。这一功能设计对防止恶意软件和不怀好意的人...

    二年级音乐下册教(学)案.doc

    这篇文档是关于二年级下册音乐课程的教学方案,包含了三节课的内容:第一课《大树妈妈》、第二课《郊游》以及第三课《儿童团放哨歌》和《共产儿童团歌》。每一课的教学目标均是通过音乐教育培养学生的环保意识、情感...

    学生吸烟问题的处理办法.doc

    在具体实施中,学校明确规定了认定吸烟行为的标准,包括学生在任何场合被发现吸烟、被举报且证据确凿、携带与吸烟相关的物品、参与他人吸烟行为的协助或者放哨,以及校外吸烟行为被证实的情况。这些标准的设定,旨在...

    河北省保定市蠡县2015_2016学年八年级生物上学期期中试卷含解析冀教版

    20. 社会行为:一只旱猴为同伴站岗放哨体现了社会行为中的合作和信息传递。 21. 信息交流:两只公鸡打架是争斗行为,不属于群体中的信息交流。 22. 动物在生物圈的作用:某些动物数量过多可能破坏植物平衡,如过度...

    农村特色课程资源.doc

    例如,春季可开展放风筝、抽陀螺、放哨火等活动,夏季则有制作玩具、养宠物和裹粽子等,秋季设计与丰收相关的游戏如摘草莓、拾稻穗,冬季则有竞技类游戏如踢毽子、挤油等,以弥补冬季户外活动的不足。通过这样的季节...

    会变的瞳孔PPT(北京版一年级下册)PPT课件.ppt

    黑夜巡逻眼似灯,厨房粮库它放哨。”孩子们可以了解到猫的一些基本特征。猫的胡须,也被称为触须,是猫的重要感知器官,它们对周围环境的触觉极为敏感,可以帮助猫感知物体的位置、形状和纹理,甚至空气中的气流变化...

Global site tag (gtag.js) - Google Analytics