天天看點

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中的接口。

繼續閱讀