c++:行为型模式

继上篇,这篇描述行为型模式。

行为型模式:

1、模板模式

(1)Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,           通过子类继承对抽象方法的不同实现改变整个算法的行为。

(2)应用在具有以下条件的应用中:

         *具有统一的操作步骤或操作过程

         *具有不同的操作细节

         *存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同

(3)模板模式的实现:在抽象类中统一操作步骤,并规定好接口;让子类实现接口。这样可以把各个具体的子类和操作步骤接                                         耦合。

2、命令模式

(1)Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调             用行为以及调用参数。

          在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调             用目标对象的方法。但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作                        command类。
          整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。-
          调用前后需要对调用参数进行某些处理。调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

(2)适用情况: 是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,                                以及支持可撤销的操作。

3、责任链模式

(1)Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不            同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

(2)适用情况:链条式处理事情。工作流程化、消息处理流程化、事物流程化。

(3)优点:

       *责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的          最小封装原则。

       *可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。

       *类与类之间可以以松耦合的形式加以组织。

(4)缺点:

       *因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。

4、策略模式

(1)Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继          承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地          处理算法的切换 。

(2)适用情况:准备一组算法,并将每一个算法封装起来,使得它们可以互换。 

5、中介者模式

(1)Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,在Mediator模式          中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的          作用。

(2)适用情况:用一个中介对象,封装一些列对象(同事)的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦                              合松散,而且可以独立的改变他们之间的交换。 

6、观察者模式

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

(2)适用情况:定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。

(3)典型应用:

        * 侦听事件驱动程序设计中的外部事件
        * 侦听/监视某个对象的状态变化
       * 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中             的订阅者

7、备忘录模式

(1)Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢            复对象以前的状态。

(2)适用情况:

       * 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复             到先前保存的状态。

       * 适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可           以根据保存的Memo还原到前一状态。

8、访问者模式

(1)Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况                下,增加新的操作角色和职责。

(2)适用情况:把数据结构 和 作用于数据结构上的操作 进行解耦合;适用于数据结构比较稳定的场合。

(3)优点:访问者模式优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行                       为集中到一个访问者对象中。

(4)缺点:增加新的数据结构变得困难了。

9、状态模式

(1)State模式也叫状态模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表          现得就好像修改了它的类一样。 
        状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的          一系列类当中,可以把复杂的判断逻辑简化。

(2)适用情况:通过用户的状态来改变对象的行为。

10、解释模式

(1)一此应用提供了内建(Build-In) 的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。Interpreter 模式的目的            就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。

11、迭代器模式

(1)Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按           顺序进行遍历访问的设计模式。

(2)在应用Iterator模式之前,首先要明白Iterator模式用来解决什么问题。或者,如果不使用Iterator模式,会存在什么问题。
       1.由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法 
       2.让调用者自己实现遍历。直接暴露数据细节给外部。

(3)以上方法1与方法2都可以实现对遍历,这样有问题呢?
    1,容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。
    2,往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行             错误等。
(4)Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以          屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。

(5)所以,Iterator模式的应用场景可以归纳为满足以下几个条件:
       * 访问容器中包含的内部对象 
       * 按顺序访问

 用代码重点描述观察者模式:

//观察者模式
#include <iostream>
#include <list>
#include <string>
using namespace std;

class Observer;

class Subject
{
public:
	virtual void add(Observer *o) = 0;
	virtual void del(Observer *o) = 0;
	virtual void notify(string info) = 0;
};

class Observer
{
public:
	virtual void update(string info) = 0;
	virtual void subscribe(Subject *s) = 0;
	virtual void unsubscribe(Subject *s) = 0;
};

class Secretary : public Subject
{
private:
	list<Observer *> *l;       //秘书所拥有的员工的列表
public:
	Secretary()
	{
		l=new list<Observer *>;
	}
	void add(Observer *o)
	{
		l->push_back(o);
	}
	void del(Observer *o)
	{
		l->remove(o);
	}
	void notify(string info)
	{
		for(list<Observer *>::iterator it=l->begin(); it!=l->end(); it++)
		{
			(*it)->update(info);
		}
	}
};

class PlayGame : public Observer 
{
public:
	void subscribe(Subject *s)
	{
		s->add(this);
	}
	void unsubscribe(Subject *s)
	{
		s->del(this);
	}
	void update(string info)
	{
		if(info=="老板来了")
		{
			cout << "开始工作" << endl;
		}
		else if(info=="老板走了")
		{
			cout << "继续玩游戏" << endl;
		}
	}
};

class WatchMovie : public Observer 
{
public:
	void subscribe(Subject *s)
	{
		s->add(this);
	}
	void unsubscribe(Subject *s)
	{
		s->del(this);
	}
	void update(string info)
	{
		if(info=="老板来了")
		{
			cout << "开始工作" << endl;
		}
		else if(info=="老板走了")
		{
			cout << "继续看电影" << endl;
		}
	}
};

int main()
{
	Subject *s=new Secretary;
	
	Observer *o1=new PlayGame;
	Observer *o2=new WatchMovie;
	
	o1->subscribe(s);
	o2->subscribe(s);
	
	cout << "老板来了" << endl;
	s->notify("老板来了");
	
	cout << "老板走了" << endl;
	s->notify("老板走了");
	
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值