[GeekBand] 设计模式之观察者模式学习笔记

       本文参考文献::GeekBand课堂内容,授课老师:李建忠

:网络资料: http://blog.csdn.net/hguisu/article/details/7556625

本文仅作为自己的学习笔记,不代表权威,因为是初学,有错误烦请大家指正,谢谢。

1、什么是观察者模式,应用场所有哪些?

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

--------360百科定义

2、结构

3、通过代码分析,模式的组成

如上图所示:观察者模式包含如下角色:

目标(Subject): 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。

//目标: 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。
Class Form
{
public:
    virtual void Attach(FileSpliter* observer);//注册观察者
    virtual void Detach(FileSpliter* observer);//释放观察者
    virtual void Notify();//通知所有注册的观察者

    interface  SplObserver
    {
        virtual void Update(Form *) = 0;  //观察者进行更新状态
    };
}

具体目标(ConcreteSubject): 将有关状态存入各ConcreteObserver对象。

//具体目标(MainForm):  将有关状态存入各MainForm对象

class MainForm : public Form
{
public:
    /**
    *  释放观察者
    */
    virtual void Attach(FileSpliter* observer)
    {
        _observers->Append(observer);
    }
    /**
    *  注册观察者
    */
    virtual void Detach(FileSpliter* observer)  //
    {
        _observers->Remove(observer);
    };

    /**
    *  通知所有观察者
    */
    virtual void Notify()
    {
        for obs in _observers  //遍历
        {
            if (observers->getState() == this->State)
            {
                obs->Update(this);
            }
        }
    };

    //设置状态
    void Button1_Click(bool State)
    {
        this->State = State;  //状态改变
        Notify();
    }

protected:
    MainForm() {}
private:
    TestBox* txtFilePath;
    TextBox* txtFileNumber;
    ProgressBar* progressBar;
    List<FileSpliter*> *_observers;
};

观察者(Observer): 为那些在目标发生改变时需获得通知的对象定义一个更新接口。当它的状态发生改变时, 向它的各个观察者发出通知。

/**
* 抽象观查者
*
*/
class FileSplitter
{
public:

    virtual void Split() = 0;
    virtual void Update(MainForm*) = 0;
    virtual ~FileSplitter() {}

protected:
    virtual void onProgress(float value)
    {

        List<FileSpliter*>::iterator itor = _observers.begin();

        while (itor != _observers.end())
            (*itor)->DisplayProgress(value); //更新进度条
        itor++;
    }
    void DisplayProgress(int value)
    {
        progressBar->setValue(value);
    }
}
private:
    string filePath;
    int fileNumber;
    bool State;
};

具体观察者(ConcreteObserver): 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。

//具体观察者1
class Spliter1 : public FileSplitter
{

public:
    Spliter1(MainForm* mf)
    {
        _subject = mf;
        _subject->State = true;
        _subject->Attach(this);
    }
    virtual ~Spliter1()
    {
        _subject->State = false
            _subject->Detach(this);
    }
    virtual void Update(MainForm *mf)
    {
        _subject->State = true;
        if (mf == _subject)
        {
            Split()
        }
    }
    virtual void Split()
    {
        //1、打开文件filePath
        //2、把文件分割成fileNumber个文件
        //3、DisplayProgress重载,以1的方式更新进度(如进度条)
        DisplayProgress(value);
    }

private:
    bool State;
    MainForm* _subject;
};

//具体观察者2
class Spliter2 : public FileSplitter
{

public:
    Spliter2(MainForm* mf)
    {
        _subject = mf;
        _subject->State = true;
        _subject->Attach(this);
    }
    virtual ~Spliter2()
    {
        _subject->State = false;
        _subject->Detach(this);
    }
    virtual void Update(MainForm *mf)
    {
        _subject->State = true;
        if (mf == _subject) {
            Split()
        }
    }
    virtual void Split()
    {
        //1、打开文件filePath
        //2、把文件分割成fileNumber个文件
        //3、DisplayProgress重载,以2的方式更新进度(如控制台...)
        DisplayProgress(value);

private:
    MainForm* _subject;
    bool State;
};

//具体观察者3
class Spliter3 : public FileSplitter
{

public:
    Spliter3(MainForm* mf)
    {
        _subject = mf;
        _subject->State = true;
        _subject->Attach(this);
    }
    virtual ~Spliter3()
    {
        _subject->State = false;
        _subject->Detach(this);
    }
    virtual void Update(MainForm *mf)
    {
        _subject->State = true;
        if (mf == _subject)
        {
            Split()
        }
    }
    virtual void Split()
    {
        //1、打开文件filePath
        //2、把文件分割成fileNumber个文件
        //3、DisplayProgress重载,以3的方式更新进度(如百分比)
        DisplayProgress(value);
    }
private:
    MainForm* _subject;
    bool State;
};

main函数

nt main()
{
    MainForm* mf = new MainForm();
    Spliter1* sp1 = new Spliter1(mf);
    Spliter2* sp2 = new Spliter2(mf);
    Spliter3* sp3 = new Spliter3(mf);
    return 0;
}

4、总结

1、通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。

2、观察者模式符合开闭原则,开闭原则是指一个软件实体应该对扩展开放,对修改关闭。也就是说软件实体必须是在不被修改的情况下被扩展。模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用。

3、

模板方法模式与对象的封装性,面向对象的三大特性:继承,封装,多态。
  对象有内部状态和外部的行为。封装是为了信息隐藏,通过封装来维护对象内部数据的完整性。使得外部对象不能够直接访问一个对象的内部状态,而必须通过恰当的方法才能访问。在C++中,采用给对象属性和方法赋予指定的修改符(public、protected、private)来达到封装的目的,使得数据不被外部对象恶意的访问及方法不被错误调用导造成破坏对象的封装性。

时间: 2024-08-04 14:04:40

[GeekBand] 设计模式之观察者模式学习笔记的相关文章

[GeekBand] 设计模式——工厂模式学习笔记

 本文参考文献:GeekBand课堂内容,授课老师:李建忠 :大话设计模式 其余的模式方法请自行查看Geekband相关课程,在此不累述. 这周的课题是: 针对DrawingSystem中的基类Shape和各个子类Line.Rec.Circle.为支持更多的形状子类,请使用某种模式来支持灵活地创建它们.使用松耦合面向对象设计方法和思想,可使用伪码表示设计. 课程中提到了四种模式,“工厂方法”.“抽象工厂”.“原型模式”.“构建器”模式.最后聚焦在了“工厂方法”和“抽象工厂”这两种方法,那么第一个

&lt;&lt;Head First设计模式&gt;&gt;之观察者模式学习

1.概念 定义了对象之间的一对多依赖关系,当一个对象(主题对象)的状态改变时,它的所有依赖者(观察者对象)都会收到通知并自动更新. 2.优势 观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需修改主题对象的代码,只需要新的观察者对象实现接口.在程序运行的过程中,可以随时注册和删除观察者而不影响主体对象. 观察者模式使主题(Subject)对象和观察者(Observer)对象都可以被轻易地复用. 3.Java中观察者模式 Java API有内置的观察者模式,java.util

设计模式--单例模式(学习笔记)

定义:      单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点.(<大话设计模式定义>): 单例模式分为两种: 1>饿汉式单例类:自己被加载时就将自己实例化. 例子:       private SingleExample() {           } private static SingleExample singleExample=new SingleExample(); @Override protected SingleExample getInstanc

《javascript 设计模式》 第15章 观察者模式 -- 学习笔记

定义: 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者 “publisher-subscriber" 模式) 是一种管理人与其任务之间的关系(确切的讲,是其对象及其行为和状态之间的关系 )的得力工具.用javascript的 话来说,这种模式的实质 就是你可以程序中某个对象的状态进行观察并且在其发生改变时能够得到通知. 观察者API: var Publisher=function(){ this.subscribers=[]; } //推送方法 Pub

设计模式之禅学习笔记

现在比较熟悉的设计模式有: slf4j=>单例模式,工厂模式,门面(外观)模式 工厂模式 vs 抽象工厂模式 工厂模式 接口,接口实现类,工厂类 抽象工厂模式 接口,借口实现类,工厂抽象类,具体的工厂实现类.红色句子是二者唯一的区别 工厂模式 vs 建造者模式 工厂模式是生产整个产品 建造者模式是重点强调建造的过程 模板模式 spring的很多类都应用了这种模式 比如一个抽象类,有很多具体的实现类继承这个抽象类 抽象类跟接口相比,优点是如果在抽象类中添加新的具体实现方法,不会影响之前已经继承的实

GeekBand第二三周学习笔记

conversion function(转换函数) 1 class Fraction 2 { 3 public: 4 Fraction(int num, int den=1) 5 : m_numerator(num), m_denominator(den){ } 6 operator double() const { 7 return (double)(m_numerator / m_denominator); 8 } //转换函数 9 private: 10 int m_numerator;

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路.----题记 设计模式 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承者更有弹性的替代方案. 设计原则 (1)封装变化. (2)多用组合,少用继承. (3)针对接口编程,而不是

java/android 设计模式学习笔记(2)---观察者模式

这篇来讲一下观察者模式,观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统.订阅--发布系统等.因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了. PS:对技术感兴趣的同鞋加群544645972一起交流. 设计模式

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(