買了本設計模式,來看看學習吧!以前的筆記都放在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();//開始殺敵
}
};