[设计模式]_[观察者模式在项目中实际使用例子]

场景:

1. 比如在界面开发中,多个窗口之间需要通讯,比较常见的方法就是各个窗口之间包含对其他窗口的引用,之后在需要时通过其他窗口的引用来调用相应的函数获取相应的值;

但是这个确定还是比较明显的,就是会造成窗口之间的依赖和耦合,想想测试或变异某个窗口时另一个窗口必须是没问题的,而另一个窗口编译又依赖它,这样成了反复依赖

导致编译不过或修改其中一个另一个就得相应的该。很麻烦,不好维护。

2. 还有的不切实际的解决办法是在窗口之间发送事件,比如qt得信号或win32的消息,但是这样会造成消息的泛滥,资源的滥用,而且都是主线程来处理事件,何必发事件呢?

解决办法:

1. 使用观察者模式来给观察者发送通知,让观察者及时响应,减少耦合。看实际的例子吧:

main.cpp

/*
 * File:   main.cpp
 */

#include <list>
#include <stdio.h>
#include <time.h>
#include <string>
#include <iostream>

using namespace std;

enum NotifyType
{
    kUpdateOutputDir = 0,
    kUpdateTitle

};

class Observer;

/**
 * 1.抽象父类,不能实例化,目标.
 */
class Subject
{
public:

    virtual ~Subject()
    {
    }
    virtual void Attach(Observer* observer);
    virtual void Detach(Observer* observer);
    virtual void Notify(void *userdata,int type);

protected:

    Subject()
    {
    }

private:
    list<Observer*> observers_;
};

/**
 * 1.抽象父类,不能实例化,观察者.
 */
class Observer
{
public:

    virtual ~Observer()
    {
    }

    virtual void Update(void* userdata,int type)
    {
    }
protected:

    Observer()
    {
    }

private:

};

//Subject

void Subject::Attach(Observer* observer)
{
    observers_.push_back(observer);
}

void Subject::Detach(Observer* observer)
{
    observers_.remove(observer);
}

void Subject::Notify(void *userdata,int type)
{
    list<Observer*>::iterator theIterator;
    for (theIterator = observers_.begin(); theIterator != observers_.end();
            theIterator++)
    {
        (*theIterator)->Update(userdata,type);
    }
}

class DhDialog : public Subject, public Observer
{
public:
    DhDialog(){}
    ~DhDialog(){}

    void Update(void* userdata,int type)
    {
        //1.增加判断类型就是只想处理指定的消息
        switch(type)
        {
            case kUpdateOutputDir:
              {
                output_dir_ =  *((string*)userdata);
                std::cout << "I am in DhDialog: " << output_dir_ << std::endl;
                break;
             }
        }
    }
    std::string title_;
    std::string output_dir_;
};

class DhOutputWindow : public Subject, public Observer
{
    public:
    DhOutputWindow(){}
    ~DhOutputWindow(){}

    void Update(void* userdata,int type)
    {
        //1.增加判断类型就是只想处理指定的消息
        switch(type)
        {
            case kUpdateTitle:
            {
                string title =  *((string*)userdata);
                //修改输出目录
                std::cout << "I am DhOutputWindow: " << title << std::endl;
                break;
            }
        }
    }

}; 

int main(int argc, char* argv[])
{
    DhDialog dialog;
    DhOutputWindow output_window_;

    //1.互相监听,注意,这里是动态添加监听,并不是互相之间直接引用各自的对象.
    dialog.Attach(&output_window_);
    output_window_.Attach(&dialog);

    dialog.title_ = "I am infoworld";
    dialog.Notify(&dialog.title_,kUpdateTitle);

    string output = "C:\\";
    output_window_.Notify(&output,kUpdateOutputDir);
}

输出:

I am DhOutputWindow: I am infoworld
I am in DhDialog: C:\
时间: 2024-08-06 04:44:57

[设计模式]_[观察者模式在项目中实际使用例子]的相关文章

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

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

OO设计模式_观察者模式

Motivation: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”————一个对象(目标对象)的状态发生改变,所有的依赖对象(观察这对象)都将得到通知.如果这样的依赖关系过于紧密,将是软件不能很好的抵御变化. 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. Intent: 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化,所有依赖于它的对象都得到通知并自动更新. Code: 1.不使用设计模式编程. //不使用设

【JAVA】Java开发使用技巧_获取当前项目中某个文件路径

下面是一个小实例,注释也很清晰,但足以说明问题. 1.实例代码 1 public class TestMain { 2 3 public static String PROJECT_NAME = "/Test/"; 4 public static String FILE_NAME = "src/com/test/NewFile.xml"; 5 6 public static void main(String[] args) throws IOException {

设计模式_观察者模式

Observer Pattern Define a ont-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新) ● Subject被观察者 定义被观察者必须实现的职责,它必须能够动

谈谈23种设计模式在Android源码及项目中的应用

本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由MarkDown语法编写,可能不同平台渲染效果不一,如果有存在排版错误图片无法显示等问题,烦请移至个人博客,如果个人博客无法访问可以留言告诉我,转载请声明个人博客出处,谢谢. 前言 本文将结合实际谈谈23种设计模式,每种设计模式涉及 * 定义:抽象化的定义与通俗的描述,尽量说明清楚其含义与应用场景 * 示例:如果项目中有使用过该模式,则会给出项目中的代码,否则会给出尽可能简单好理解的java

SpringBoot 项目中的观察者模式

1.观察者模式的定义: 观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 2.观察者模式的原理: 实现观察者模式有很多形式,比较直观的一种是使用一种"注册--通知--撤销注册"的形式.下面的三个图详细的描述了这样一种过程:其中,观察者模式定义了四种角色:抽象主题.具体主题.抽象观察者.具体观察者. 抽象主题(Subject):该角色是一个抽象类或接口,定义了增加.删除.通知观察者对象的方法. 具体主题(Concre

小谈网关项目中的设计模式

基于个人的经验,谈谈设计模式在网关中的应用.因为是经验之谈,没有绝对的对与错. 下面整理的是我最常使用的设计模式,我用设计模式的前提是 让代码的可读性变强 能支持日后功能扩展 单例 目的 保证全局只有一个实例,防止因为频繁的创建.销毁对象而造成不必要的性能开销. 在网关项目中,单例模式是出现频率最高的模式.同时,所有的单例对象被 IoC 框架 Guice 统一管理. 场景 1 网关会处理各种逻辑.一般将业务逻辑从主流程中抽取出来,封装在一个独立对象中.可以使用单例模式来保证全局唯一,使用注解 S

设计模式在项目中的应用

简单工厂设计模式在项目中应用 项目使用场景:根据不同的厂家,有不同的报表打印形式,而对于报表的打印他们有公共的部分,打印报表头.打印底部.和打印中间部分. 我们可以使用简单工厂模式,抽象出打印报表的接口,不同的厂家实现不同的打印接口. 单例模式在项目中应用 场景1:在DOM读取配置文件的时候,因为经常被用到这个类,我们可以设置一个全局类,不用每次都new那么多的类,节省资源消耗. 场景2:在spring的IOC依赖注入的时候,默认的是采用单例模式,例如controller层中一个类通过注入方式使

C#项目中常用到的设计模式

1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,这也是设计模式的开始.熟练运用设计模式应该是每一个软件开发人员的必备技能.今天给大家介绍几个常用的设计模式. 2. 单例模式 单例模式恐怕是很多开发人员最先接触到的模式之一,可以认为就是一个全局变量.它的初始化过程无非就是一开始就new 一个instance,或者惰性初始化等需要用到的时候new 一个instanc