模式一:策略模式(Strategy Pattern)——实现可替换算法

  • 策略模式

定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。


  • 应用分析——变化部分的实现

一种类型经常变化的部分,如果放在基类里面,变化的子类需要重新实现,不利于代码重用;

如果定义在抽象类里面,通过继承自不同的抽象类,可以获得不同的行为,这也可以实现,通常,继承增加代码之间的耦合度,用组合可以实现松耦合

因此,我们定义行为的算法族(抽象类),分别封装实现(派生出不同的行为对象),使它们之间可以相互替换,这样,我们用相同的接口组合不同的行为对象对象,就可以得到不同的行为。


  • 实例介绍——不同的鸭子:都会游泳;展示不同的外表;有的鸭子会飞,有的不会飞;有的呱呱叫,有的吱吱叫,有的不会叫。

  • 代码分析

<strong>//file:Behavior.h </strong>
#ifndef BEHAVIOR_H
#define BEHAVIOR_H

class FlyBehavior//飞行行为抽象类 
{
	public:
		virtual void fly()=0;
};

class FlywithWings:public FlyBehavior//可以飞 
{
	public:
		virtual void fly();
};

class FlynoWay:public FlyBehavior//不能飞 
{
	public:
		virtual void fly();
};



class QuackBehavior//叫行为抽象类 
{
	public:
		virtual void quack()=0;
};

class Quack:public QuackBehavior//呱呱叫 
{
	public:
		virtual void quack();
};
class Squeak:public QuackBehavior//吱吱叫 
{
	public:
		virtual void quack();
};
class MuteQuack:public QuackBehavior//不叫 
{
	public:
		virtual void quack();
}; 


#endif


<strong>//file:Behavior.cpp</strong>
#include <iostream>
#include "Behavior.h"
void FlywithWings::fly()
{
	std::cout<<"I'm flying!"<<std::endl;
} 

void FlynoWay::fly()
{
	std::cout<<"I can't fly!"<<std::endl;
}



void Quack::quack()
{
	std::cout<<"quack!"<<std::endl;
}

void Squeak::quack()
{
	std::cout<<"squack!"<<std::endl;
}

void MuteQuack::quack()
{
	std::cout<<"mutequack!"<<std::endl;
}


<strong>//file:Duck.h </strong>
#ifndef DUCK_H
#define DUCK_H

#include "Behavior.h"
class Duck//鸭子抽象类 
{
	protected://飞行和叫委托给行为对象 ,行为便于扩展 
		FlyBehavior *ptrFly;
		QuackBehavior *ptrQuack;
	public:
		void swim();
		virtual void display()=0;
		void performQuack();
		void performFly();
		void setFly(FlyBehavior *ptrFly);
		void setQuack(QuackBehavior *ptrQuack);
};

//两种不同的鸭子实现 
class RedHeadDuck:public Duck
{
	public:
		RedHeadDuck();
		void display();
		virtual ~RedHeadDuck();
};

class RubberDuck:public Duck
{
	public:
		RubberDuck();
		void display();
		virtual ~RubberDuck();
};

#endif


<strong>//file:Duck.cpp</strong>
#include "Duck.h"
#include <iostream>

void Duck::swim()
{
	std::cout<<"I'm swimming!"<<std::endl;
}
void Duck::performQuack()
{
	ptrQuack->quack();
}
void Duck::performFly()
{
	ptrFly->fly();
}
void Duck::setFly(FlyBehavior *ptrFly)
{
	this->ptrFly=ptrFly;
}
void Duck::setQuack(QuackBehavior *ptrQuack)
{
	this->ptrQuack=ptrQuack;
}


void RedHeadDuck::display()
{
	std::cout<<"I'm RedHeadDuck!" <<std::endl;
}

RedHeadDuck::RedHeadDuck()
{
	ptrFly=new FlywithWings();
	ptrQuack=new Quack();
}

RedHeadDuck::~RedHeadDuck()
{
	delete ptrFly;
	delete ptrQuack;
}

void RubberDuck::display()
{
	std::cout<<"I'm RubberDuck!" <<std::endl;
}

RubberDuck::RubberDuck()
{
	ptrFly=new FlynoWay();
	ptrQuack=new Squeak();
}

RubberDuck::~RubberDuck()
{
	delete ptrFly;
	delete ptrQuack;
}



<strong>//file:main.cpp</strong>
#include <iostream>

#include "Duck.h"
/*不同的鸭子:
都会游泳;
展示不同的外表;
有的鸭子会飞,有的不会飞;
有的呱呱叫,有的吱吱叫,有的不会叫。*/



int main(int argc, char** argv) 
{
	Duck *duck1=new RedHeadDuck();
	duck1->display();
	duck1->swim();
	duck1->performFly();
	duck1->performQuack();
	duck1->setFly(new FlynoWay());//设置飞行方式,动态改变行为 
	duck1->performFly();
	
	Duck *duck2=new RubberDuck();
	duck2->display();
	duck2->swim();
	duck2->performFly();
	duck2->performQuack();
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值