当前位置:首页 > 服务端 > 设计模式:观察者模式

设计模式:观察者模式

2022年09月17日 11:06:51服务端6

 设计模式系列目录

今天介绍另一种模式

观察者模式是我们经常用的一个模式,比如在用wcf做服务的时候通知客户端做一些操作一般用设计者模式。

今天做一个订报纸的小例子来理解一下观察者模式  出版者+订阅者=观察者模式

                                用下边的图来说就是    人民日报+订阅者=观察者模式

设计模式:观察者模式 _ JavaClub全栈架构师技术笔记只要是订阅了人民日报的人,有了新报纸就会送到订阅者那里去,

当你不想订的时候取消就不订阅就不会再收到报纸了。

设计模式:观察者模式 _ JavaClub全栈架构师技术笔记

下面我们就来用代码实现一下这个模式

 //报纸接口
    public interface INewsPaper
    {
        //添加订阅者
        void RegisterSubscriber(ISubScribe f_subScribe);
        //取消订阅
        void RemoveSubScriber(ISubScribe f_subScribe);
        //发送报纸
        void SendPaper();
    }

    //订阅者
    public interface ISubScribe
    {
        //有新的报纸了就会被执行通知
        void HasNewPaper();
    }

    //人民日报
    public class PeopleNewsPaper : INewsPaper
    {
        private List<ISubScribe> subList = new List<ISubScribe>();
        public void RegisterSubscriber(ISubScribe f_subScribe)
        {
            subList.Add(f_subScribe);
        }

        public void RemoveSubScriber(ISubScribe f_subScribe)
        {
            if (subList.IndexOf(f_subScribe) >= 0)
            {
                subList.Remove(f_subScribe);
            }
        }

        //发报纸啦~~
        public void SendPaper()
        {
            foreach (ISubScribe _sub in subList)
            {
                _sub.HasNewPaper();
            }
        }      
    }

    public class subHuman : ISubScribe
    {
        //订阅者的名字
        private string p_name;

        public subHuman(string f_name)
        {
            p_name = f_name;
        }
        //告诉订阅者有新报纸了
        public void HasNewPaper()
        {
            Console.WriteLine(p_name + "!! 有新的报纸了,请查收!");
        }
        
    }

开始订订阅,和调用了

static void Main(string[] args)
        {
            PeopleNewsPaper _paper = new PeopleNewsPaper();
            subHuman _XiaoMing = new subHuman("小明");
            subHuman _ZhaoYun = new subHuman("赵云");
            subHuman _LiuBei = new subHuman("刘备");
            //小明订报
            _paper.RegisterSubscriber(_XiaoMing);
            //赵云订报
            _paper.RegisterSubscriber(_ZhaoYun);
            //刘备订报
            _paper.RegisterSubscriber(_LiuBei);
            //有新报纸了
            _paper.SendPaper();
            Console.WriteLine("---------------发完报纸了------------------");

            //小明不想订了,取消报纸
            _paper.RemoveSubScriber(_XiaoMing);
            //又有新报纸了  就没有小明的报纸 了
            _paper.SendPaper();
            Console.ReadLine();
        }

  设计模式:观察者模式 _ JavaClub全栈架构师技术笔记

 

 c++代码

设计模式:观察者模式 _ JavaClub全栈架构师技术笔记
#pragma once
#include <iostream>

//订阅者
class ISubScribe
{
public:
    //有新的报纸了就会被执行通知
    virtual void HasNewPaper() = 0;

    virtual ~ISubScribe(){}
};

//报纸接口
class INewsPaper
{
public:
    //添加订阅者
    virtual void RegisterSubscriber(ISubScribe* f_subScribe) = 0;
    //取消订阅
    virtual void RemoveSubScriber(ISubScribe* f_subScribe) = 0;
    //发送报纸
    virtual void SendPaper() = 0;

    virtual ~INewsPaper(){}
};
View Code
设计模式:观察者模式 _ JavaClub全栈架构师技术笔记
#pragma once
#include "inewspaper.h"
#include <iostream>
#include <vector>
using namespace std;

class PeopleNewsPaper :
    public INewsPaper
{
public:
    PeopleNewsPaper();

    virtual ~PeopleNewsPaper();

    //添加订阅者
    void RegisterSubscriber(ISubScribe* f_subScribe);
    //取消订阅
     void RemoveSubScriber(ISubScribe* f_subScribe);
    //发送报纸
    void SendPaper();

private:
    vector<ISubScribe*> subs;
};

#include "PeopleNewsPaper.h"
#include <algorithm>


void MyClearSub(ISubScribe* sub)
{
    if (sub) {
        delete sub;
        sub = nullptr;
    }
}
PeopleNewsPaper::PeopleNewsPaper()
{

}


PeopleNewsPaper::~PeopleNewsPaper()
{
    if (!subs.empty()) {
        for_each(subs.begin(), subs.end(), MyClearSub);
        subs.clear();
    }
}




//添加订阅者
void PeopleNewsPaper::RegisterSubscriber(ISubScribe* f_subScribe)
{
    if (subs.empty()) {
        subs.push_back(f_subScribe);
    }
    else if (find(subs.begin(), subs.end(), f_subScribe) == subs.end()) {
        subs.push_back(f_subScribe);
    }
}

//取消订阅
void PeopleNewsPaper::RemoveSubScriber(ISubScribe* f_subScribe)
{
    vector<ISubScribe*>::iterator itor = find(subs.begin(), subs.end(), f_subScribe);
    if (itor != subs.end()) {
        subs.erase(itor);
        MyClearSub(f_subScribe);
    }
}

//发送报纸
void PeopleNewsPaper::SendPaper()
{
    for (ISubScribe* sub : subs) {
        sub->HasNewPaper();
    }
}
View Code
设计模式:观察者模式 _ JavaClub全栈架构师技术笔记
#pragma once
#include "inewspaper.h"
#include <iostream>
#include <string>

class SubHuman :
    public ISubScribe
{
public:
    SubHuman(std::string name);
    ~SubHuman();
    void HasNewPaper();

private:
    std::string m_name;
};

#include "SubHuman.h"

using namespace std;
SubHuman::SubHuman(string name)
{
    m_name = name;
}


SubHuman::~SubHuman()
{
}

void SubHuman::HasNewPaper()
{
    std::cout << m_name << "有报纸来了!!" << endl;
}
View Code

调用

设计模式:观察者模式 _ JavaClub全栈架构师技术笔记
#include <iostream>
#include "inewspaper.h"
#include "PeopleNewsPaper.h"
#include "SubHuman.h"

int main()
{
    INewsPaper* peopPaper = new PeopleNewsPaper();
    ISubScribe* sub = new SubHuman("小李");
    peopPaper->RegisterSubscriber(sub);
    sub = new SubHuman("小张");
    peopPaper->RegisterSubscriber(sub);
    sub = new SubHuman("小刘");
    peopPaper->RegisterSubscriber(sub);
    peopPaper->SendPaper();
    peopPaper->RemoveSubScriber(sub);
    peopPaper->SendPaper();
    delete peopPaper;

}
View Code

 

作者:li-peng
来源链接:https://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/42491.html

标签: 设计模式
分享给朋友:

“设计模式:观察者模式” 的相关文章

常用设计模式系列(三)—抽象工厂模式

常用设计模式系列(三)—抽象工厂模式

一、前言 各位大佬好,又是一个冷嗖嗖的日子,这个城市的天气最近一直都不太好,说下雪吧也不下,天气也不晴,让人甚是难受。前段时间周围的城市都下雪了,盼了好久的雪也没盼到,只等来了冷风作祟。基于我的心情,我来吟诗一首: ​ 《盼雪》 昨日已别大雪, 吾昼夜盼雪至。...

设计模式面试|Java面试题

1.请列举出在 JDK 中几个常用的设计模式?  单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中。工厂模式 (Factory pattern)被用于各种不可变的类如 Boolean,像 Boolea...

[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大家.对于这次跳槽找工作, 我准备了挺长的时间, 其中也收集了很多比...

《java编程思想》:设计模式(不定期更新)

1.策略设计模式   创建一个能够根据所传递的参数对象的不同而具有不同的方法,被称为策略设计模式。这类方法包含索要执行的算法中固定不变的部分,而“策略”包含变化的部分。策略就是传递进去的参数对象。在下面的代码示例中,Process对象就是策略。应用在了s上。 代码示例:...

Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析

     第二阶段的课程主要围绕着Volatile关键字,内存重排序,Happen-Before,Cpu一致性协议,高并发下的设计模式以及类加载器几个大的方面展开,下面是内容详细信息,本教程是本人录制,下载地址为 高并发设计模式 汪文...

常用设计模式

常用设计模式

设计模式 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联和组合关系的充分理解。 正确使用设计模式具有一下优点: 1、...

设计模式的分类

1.设计模式有两种分类 按目的型来分:1.创建型   2.结构型  3.行为型 一、 5种创建型模式:工厂方法模式,抽象模式,建造者模式,原型模式,单例模式   二、7种结构型模式:适配器模式,桥接模式,组...

联想高级Java研发面经+面试题:Spring+多线程+MySQL+设计模式

联想高级Java研发面经+面试题:Spring+多线程+MySQL+设计模式

上个礼拜,之前的一个同事突然联系我说他去面了联想的JAVA开发工程师,想分享一下面试经历和面试题。我当时就拍板说,好啊! 然后就整理了一下,写了这篇文章;和大家分享一下这次面试经验和面试题。 薪资还可以啊,年薪40W+啊!多少...

Java中常用的10种设计模式详解

1. 观察者模式 定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。 对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter , 当然...

学习 IOC 设计模式前必读:依赖注入的三种实现

学习 IOC 设计模式前必读:依赖注入的三种实现

学习 IOC 设计模式前必读:依赖注入的三种实现 学无止境,精益求精 十年河东十年河西,莫欺少年穷 呵呵,此篇博客转载自:http://www.cnblogs.com/liuhaorain/p/3747470.html 摘要 面向对象设计(OO...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。