设计模式——观察者模式

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

//观察者
class Observer
{
public:
	Observer(){};
	virtual ~Observer(){}

	virtual void Update() = 0;	
};

//被观察者
class Subject
{
public:
	Subject(){}
	virtual ~Subject(){}
	
	//添加观察泽
	void AddObserver(Observer *obj)
	{
		this->obs.push_back(obj);
	}
	
	//删除观察者
	void DeleteObsever(Observer *obj)
	{
		vector<Observer *>::iterator it;
		for(it=this->obs.begin();it!=this->obs.end();++it)
		{
			if(obj == *it)
			{
				this->obs.erase(it);
				//delete obj;
			}
		}
	}
	
	//通知观察者
	void NotifyObsever()
	{
		vector<Observer *>::iterator it;
		for(it=this->obs.begin();it!=this->obs.end();++it)
		{
			Observer *obj = *it;
			obj->Update();
		}
	}
	
	void Change()
	{
		NotifyObsever();
	}
	
private:
	vector<Observer*> obs;	
};



class ObserverA:public Observer
{
public:
	ObserverA(){};
	virtual ~ObserverA(){}	
	
	void Update()
	{
		printf("I'm observer A ,updated\n");
	}
};

class ObserverB:public Observer
{
public:
	ObserverB(){};
	virtual ~ObserverB(){}	
	
	void Update()
	{
		printf("I'm observer B ,updated\n");
	}
};

int main()
{
	Subject s;
	ObserverA a;
	ObserverB b;
	s.AddObserver(&a);
	s.AddObserver(&b);
	s.Change();
}

定义:
定义了算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立于使用算法的客户
设计原则:
1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
2、针对接口编程,而不是针对实现编程
3、多用组合,少用继承
适用性:
1、许多相关的类仅仅是行为有异,策略模式提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态的在几种算法中选择一种
2、需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法,当这些变体实现为一个算法的类层次时,可以使用策略模式
3、算法使用客户不应知道的数据,可以使用策略模式避免暴露复杂的,与算法相关的数据结构
4、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入他们格式的类中代替这些条件语句
实现:
1、定义所有支持算法的公共接口
2、继承接口类,实现具体的算法
3、维护一个对公共接口对象的引用,用该引用来调用具体的算法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值