設計模式觀後(c++還原 里氏替換原則)

買了本設計模式,來看看學習吧!以前的筆記都放在github 上面的,這個就放csdn上吧!自己天天更新!

//里氏替換原則
1子類完全實現父類的方法
2子類可以有自己的個性
3覆蓋實現父類方法時輸入參數可以被放大。


//手槍、士兵、場景設計
class AbstractGun
{
public:
	virtual void shoot() {
		cout << "kill people!";
	}
};

class HandGun : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "handgun kill";
	}
};

class Rifle : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "rifle kill";
	}
};

class MachineGun : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "machinegun kill";
	}
};

class Soldier
{
public:
	void SetGun(AbstractGun* _gun) {
		m_gun = _gun;
	}
	
	virtual void KillEnemy() {
		m_gun->shoot();//這個很好,可以分別執行虛函數。
	}
	virtual ~Soldier() {};
protected:
	AbstractGun* m_gun;
};

//當添加新類“玩具槍”的時候,玩具槍殺不死人,無法執行killenemy等。
//如果子類不能完整的實現父類的方法,
//建議斷開父子關係,採用依賴、聚集、組合等關係替代繼承。
class ToyGun
{
public:
	/////......./////
};

//子類可以有自己的個性
class AUG : public Rifle
{
public:
	void zoomeout() {
		cout << "observed enemy";
	}
	virtual void shoot() {
		cout << "AUG kill";
	}
};

//添加狙擊槍,就要給個狙擊手,我自己設計派生(或許其他情況是不允許的吧)
class Snipper : public Soldier
{
public:

	virtual void KillEnemy() {
		AUG* aug = static_cast<AUG*>(m_gun);
		aug->zoomeout();
		aug->shoot();
	}
};

class Client
{
public:
	//這裏使用static,表示外部可以直接所屬域調用,爲了方便設定。
	static void Action() {
		Snipper* shibin = new Snipper;
		shibin->SetGun(new AUG);
		shibin->KillEnemy();//開始殺敵
	}
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章