c++设计模式----观察者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvdepeng123/article/details/86071116

设计模式是软件工程的基石脉络,如同大厦 的结构一样。设计模式的分类,可分为创建型模式,结构性模式,行为型模式。

1 创建型模式:通常和对象的创建有关,涉及到对象的实例化方式。大概有五种模式

工厂方法模式 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类
抽象工厂模式 创建一系列相关或者相互依赖的接口,而无需指定他们具体的类
   
建造者模式 将一个复杂分构建与其分离,使得同样的构建过程中可以创建不同的表示
原型模式 原型实例指定创建对象的种类,并且通过这些原型来创建新的对象
单例模式 是保证一个类仅有一个实例,并且提供它一个访问它的全局访问点

2 结构性模式:描述的是如何组合类和对象以获得更大的结构。大概有以下几种模式

代理模式 就是为其他对象提供一种代理以控制对这个对象的访问。
装饰者模式 动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。 
适配器模式 是将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接模式 是将抽象部分与实际部分分离,使它们都可以独立的变化。
组合模式 是将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。
外观模式(Facade Pattern) 是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
   

3行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述

模板方法模式(Template Method Pattern) 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 
命令模式(Command Pattern 是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
 
责任链模式(Chain of Responsibility Pattern) 在该模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
策略模式(Strategy Pattern) 就是准备一组算法,并将每一个算法封装起来,使得它们可以互换。
中介者模式(Mediator Pattern) 就是定义一个中介对象来封装系列对象之间的交互。终结者使各个对象不需要显示的相互调用 ,从而使其耦合性松散,而且可以独立的改变他们之间的交互。
 
观察者模式 )定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
备忘录模式(Memento Pattern) 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
访问者模式(Visitor Pattern) 就是表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
 
状态模式(State Pattern) )就是对象的行为,依赖于它所处的状态。
解释器模式(Interpreter Pattern) 就是描述了如何为简单的语言定义一个语法,如何在该语言中表示一个句子,以及如何解释这些句子。 
 

设计模式的基本准则,设计模式体现的软件设计的思想,而不是软件技术,她重在使用多态和抽象类来解决问题

1 开放封闭原则:

 类的改动是通过增加代码进行的,而不是修改源代码

2依赖倒置原则:

依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程

 

 3 迪米特原则:一个软件实体应当尽可能少地与其他实体发生相互作用

下面我用实例来说明行为型模式中的观察者模式

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

模式中包含的角色和职责


 

#include <iostream>
#include <list>
#include <string>

using namespace std;
//定义一个抽象的通知着
class Observer;

class inform
{
public:
	virtual void sendInformationToObserver(string _strContent) = 0;
	virtual void addObserver(Observer *) = 0;
	virtual void deleteObserver(Observer *) = 0;
protected:
	list<Observer *> m_list;
};
//重新的观察者
class Observer
{
public:
	virtual void  updateState(string _strContent) = 0;
	virtual void  subscribe(inform *) = 0;
	virtual void  disubscribe(inform *) = 0; //观察者也可以自身订通知者

};
class monitor : public inform
{
public:
	void addObserver(Observer *whichPerson)
	{
		m_list.push_back(whichPerson);
	}
	void deleteObserver(Observer *whichPerson)
	{
		m_list.remove(whichPerson);
	}
	void sendInformationToObserver(string _strContent)
	{
		for (list<Observer*>::iterator it = m_list.begin();it!= m_list.end();it++)
		{
			(*it)->updateState(_strContent);
		}

	}

};

class xiaoMing:public Observer
{
public:
	void updateState(string _strContent)
	{
		cout << _strContent << endl << "我要写作业了"<<endl;
	}
	void subscribe(inform *whichInform)//观察者可以订阅哪个通知者
	{
		whichInform->addObserver(this);
	}
	void disubscribe(inform *whichInform)
	{
		whichInform->deleteObserver(this);
	}

};
int _tmain(int argc, _TCHAR* argv[])
{
	
	inform * object = new monitor;
	Observer *object1 = new xiaoMing;

	object->addObserver(object1);
	object->sendInformationToObserver("老师来了");
    
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lvdepeng123/article/details/86071116