设计模式(4)——观察者模式

本文深入解析观察者模式,探讨其定义、动机、角色扮演及优缺点。通过代码示例展示如何实现观察者模式,适用于对象间的一对多依赖关系,确保高效的数据同步与更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。

动机

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象的状态改变,所有的依赖对象都得到通知。如果这样的依赖关系过于紧密,将会使软件不能很好地抵御变化。

使用面向对象技术,可以使这种依赖关系弱化,并形成一种稳定的依赖的关系,从而使软件体系更加具有耦合性

角色扮演

抽象主题角色(Subject)

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

具体主题角色(RealSubject)被观察对象

将有关状态存入各具体观察者对象;当它的状态发生改变时,向它的各个观察者发出通知

抽象观察者(Observer)

为那些在抽象主题发生改变时需获得通知的对象定义一个更新的接口

具体观察者角色(RealObserver、RealObserver1)

维护一个具体主题对象的引用;存储有关状态,这些状态应与抽象主题的状态保持一致;实现Oberver的更新接口以使自身状态与抽象主题的状态保持一致

举例说明

这里我们注册两个观察者,当具体主题有状态变化时,通知观察者,作数据的更新同步

//抽象观察者
class Observer
{
    public:
        Observer();
        virtual ~Observer();
        virtual void Update(int) = 0 ;
    protected:
    private:
};


//具体观察者1
class RealObserver :public Observer
{
    public:
        RealObserver(){} 
        virtual ~RealObserver();
        void Update(int value){
            cout<< "RealObserser get the new value: "<< value <<endl ;
        }
    protected:
    private:
};

//具体观察者2
class RealObserver1 :public Observer
{
    public:
        RealObserver1(){}
        virtual ~RealObserver1();
        void Update(int value){
            cout<< "RealObserser1 get the new value: "<< value <<endl ;
        }
    protected:
    private:
};

//抽象主题
class Subject
{
    public:
        Subject();
        virtual ~Subject();
        virtual void Add(Observer *) = 0; //具有注册观察者的接口
        virtual void Del(Observer *) = 0; //具有注销观察者的接口
        virtual void Inform() = 0;        //具有通知的方法
    protected:
    private:
};

//具体主题
class RealSubject : public Subject
{
    public:
        RealSubject();
        virtual ~RealSubject();
        void Add(Observer* pObserver);  //注册观察者具体实现
        void Del(Observer *pObserver);   //注销观察者的具体实现
        void Inform();                   //通知的具体实现
        void SetState(int state){      //状态改变方法
            m_state = state;
        }
    protected:
    private:
        std::list<Observer* > m_Observerlist;  //声明一个观察者链表引用
        int m_state;                        
};
void RealSubject::Add(Observer* pObserver){
    m_Observerlist.push_back(pObserver);
}

void RealSubject::Del(Observer* pObserver){
    m_Observerlist.remove(pObserver);
}

void RealSubject::Inform(){
    std::list<Observer* >::iterator it = m_Observerlist.begin(); //依次通知
    while(it != m_Observerlist.end()){
        (*it)->Update(m_state);
        ++it;
    }
}

demo:

int main(){
RealSubject * rsub = new RealSubject(); //创建具体主题
 
Observer * ob1 = new RealObserver();  //创建观察者
Observer * ob2 = new RealObserver1();

rsub->SetState(10); //改变一数据

rsub->Add(ob1);  //观察者注册
rsub->Add(ob2);

rsub->Inform();  //发出通知

rsub->SetState(9);  //改变一数据
rsub->Del(ob2);   //注销一个观察者

rsub->Inform();  //再次发出通知
return 0;
}

结果:

第一次发出通知前,由于注册了两个观察者,因此两个观察者对象都收到更新数据的通知;而第二次发出通知前,已经有一个观察者退出观察行列,因此只有观察者1收到了通知。

优点

观察者和被观察者是一套触发机制:保证高度的协作;

缺点

观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

应用场景

(1)当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这二者封装在独立的对象中,以使他们可以独立的改变和复用

(2)当对一个对象的改变需要同时改变其他的对象,而不知道具体有多少对象有待改变

(3)当对一个对象必须通知其他对象,而他不能假定其他对象是谁,也就是说,你不希望这些对象是精密耦合

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值