23种设计模式之(十八)观察者模式(Observer)
本文主要介绍23种设计模式之观察者模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
观察者模式(Observer)
概念
观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
GoF对观察者模式的定义是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
应用场景
(1)、 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
(2)、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
(3)、一个对象必须通知其他对象,而并不知道这些对象是谁。
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 观察者模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180918
/************************************************************************/
#include <iostream>
#include "string"
#include "list"
class Secretary;
//观察者
class PlayserObserver
{
public:
PlayserObserver(Secretary *secretary)
{
this->m_secretary = secretary;
}
void update(std::string action)
{
printf("action:%s\n",action.c_str());
}
private:
Secretary *m_secretary;
};
//
class Secretary
{
public:
Secretary()
{
m_list.clear();
}
void Notify(std::string info)
{
//给所有的 观察者 发送 情报
for ( std::list<PlayserObserver *>::iterator it=m_list.begin(); it!=m_list.end(); it++)
{
(*it)->update(info);
}
}
void setPlayserObserver(PlayserObserver *o)
{
m_list.push_back(o);
}
private:
std::list<PlayserObserver *> m_list;
};
void main()
{
Secretary *secretary = NULL;
PlayserObserver *po1 = NULL;
PlayserObserver *po2 = NULL;
secretary = new Secretary;
po1 = new PlayserObserver(secretary);
po2 = new PlayserObserver(secretary);
secretary->setPlayserObserver(po1);
secretary->setPlayserObserver(po2);
secretary->Notify("boss come ") ;
secretary->Notify("boss gone ");
delete secretary ;
delete po1 ;
delete po2 ;
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 观察者模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180918
##################################################################
# 观察者
class PlayserObserver(object):
def __init__(self, secretary):
self.m_secretary = secretary
def update(self, action):
print("action:%s" % action)
class Secretary(object):
def __init__(self):
self.m_list = []
def show_notify(self, info):
# 给所有的 观察者 发送 情报
for every in self.m_list:
every.update(info)
def set_playser_observer(self, observer):
self.m_list.append(observer)
if __name__ == "__main__":
secretary = Secretary()
po1 = PlayserObserver(secretary)
po2 = PlayserObserver(secretary)
secretary.set_playser_observer(po1)
secretary.set_playser_observer(po2)
secretary.show_notify("boss come ")
secretary.show_notify("boss gone ")