Head_First 第一章:Strategy Pattern

定义DUCK类来作为一个超类,所有的鸭子类都继承它,但是这不能很好的解决问题,因为鸭子的行为字子类中不停的改变,并且让所有的子类都有这些行为是不恰当的,使用接口,虽然可以解决,但不能解决代码复用的问题,因为接口不具有实现代码,因此:

   我们应该找出应用中可能需要变化之处,把他们独立出来,和那些不需要变化的分离开。使得代码变化引起的不经意后果变少,系统更有弹性。

  尽量多用组合,少用继承!!使用组合不仅可以将算法族封装成类,还可以在运行时动态的改变行为,只要组合的行为对象符合正确的接口标准。


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

// DesignPattern.cpp : 定义控制台应用程序的入口点。
//

#include 
   
   
    
    
using namespace std;

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

class FlyWithWings :public FlyBehavior{

public:
	void fly(){
	
		cout << "I am flying";
	}
};
class FlyNoWay :public FlyBehavior{

public:
	void fly(){

		cout << "I can not fly";
	}
};

class QuackBehavior{   //鸭子叫声行为类
public:
	virtual void quack()=0;
};
class Quack :public QuackBehavior{

public:
	void quack(){

		cout << "Quack";
	}
};
class MuteQuack :public QuackBehavior{

public:
	void quack(){

		cout << "science";
	}
};
class Squack :public QuackBehavior{

public:
	void quack(){

		cout << "squeak";
	}
};


class Duck{
public:
	FlyBehavior *flyBehavior;
	QuackBehavior *quackBehavior;//组合起来,使具体的鸭子类来继承他们

	Duck(){};
	virtual void display() = 0;
	void performFly(){
	
		flyBehavior->fly();
	}

	void performQuack(){
	
		quackBehavior->quack();
	}
	void setFlyBehavior(FlyBehavior *fb){
	
		flyBehavior = fb;
	}
	void setQuackBehavior(QuackBehavior *qb){

		quackBehavior = qb;
	}
};


class MallardDuck :public Duck{

public:
	MallardDuck(){

		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	void display(){
	
		cout << "I am a real Mallard duck"<
    
    
     
     performFly(); //可以飞行
	mallard->setFlyBehavior(new FlyNoWay());//然后动态的设定不可以飞行,而不用改变原来的代码
	mallard->performFly();
	mallard->performQuack();
	return 0;
}


    
    
   
   


现在我们可以动态的增加鸭子的新行为,也可以增加行的鸭子类,然后动态的设定它的行为,而不用去修改原来的代码。

C++中,当一个类的成员函数均为纯虚函数时,就相当于JAVA中的接口。


   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值