拜读大牛秦小波所著的《设计模式之禅》,从中学习到的做一个记录,其中所涉及的思想,定义等版权属于秦小波先生,个人纯属学习!
一、里氏替换原则定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类对象)。
二、类图
三、代码
LSP.h
#pragma once
//父类
class AbstaractGun
{
public:
AbstaractGun();
~AbstaractGun();
virtual void shoot();
private:
};
//子类 手枪
class HandGun:public AbstaractGun
{
public:
HandGun();
~HandGun();
void shoot();
private:
};
//子类 步枪
class Rifle:public AbstaractGun
{
public:
Rifle();
~Rifle();
void shoot();
private:
};
//子类AUG狙击枪
class AUG:public Rifle
{
public:
AUG();
~AUG();
void zoomOut();
void shoot();
private:
};
//子类 机枪
class MachineGun:public AbstaractGun
{
public:
MachineGun();
~MachineGun();
void shoot();
private:
};
//士兵实现类
class Soldier{
public:
Soldier();
~Soldier();
void setGun(AbstaractGun *_gun);
void killEnemy();
private:
AbstaractGun *gun;
};
//狙击手
class Snipper
{
public:
Snipper();
~Snipper();
void killEnemy(AUG *aug);
private:
};
LSP.cpp
// LSP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "LSP.h"
#include <iostream>
using std::string;
using std::cout;
using std::endl;
//父类
AbstaractGun::AbstaractGun()
{
}
AbstaractGun::~AbstaractGun()
{
}
void AbstaractGun::shoot()
{
//cout<<"开始射击啦!" <<endl;
}
//子类 手枪
HandGun::HandGun()
{
}
HandGun::~HandGun()
{
}
void HandGun::shoot()
{
cout<<"手枪射击"<<endl;
}
//子类 步枪
Rifle::Rifle()
{
}
Rifle::~Rifle()
{
}
void Rifle::shoot()
{
cout<<"步枪射击"<<endl;
}
AUG::AUG()
{
}
AUG::~AUG()
{
}
void AUG::zoomOut()
{
cout<<"通过望远镜观察敌人..."<<endl;
}
void AUG::shoot()
{
cout<<"AUG射击"<<endl;
}
//子类 机枪
MachineGun::MachineGun()
{
}
MachineGun::~MachineGun()
{
}
void MachineGun::shoot()
{
cout<<"机枪扫射"<<endl;
}
//士兵实现类
Soldier::Soldier()
{
}
Soldier::~Soldier()
{
}
void Soldier::setGun(AbstaractGun *_gun)
{
this->gun = _gun;
}
void Soldier::killEnemy()
{
cout<<"士兵开始杀敌人"<<endl;
gun->shoot();
}
Snipper::Snipper()
{
}
Snipper::~Snipper()
{
}
void Snipper::killEnemy(AUG *aug)
{
aug->zoomOut();
aug->shoot();
}
int _tmain(int argc, _TCHAR* argv[])
{
Soldier *sanMao = new Soldier();
//sanMao->setGun(new Rifle());
//直接将工具类型传入
sanMao->setGun(new MachineGun());
sanMao->killEnemy();
Snipper *erDan = new Snipper();
//erDan->setGun(new AUG());
erDan->killEnemy(new AUG());
return 0;
}
运行结果:
士兵开始杀敌人
机枪扫射
通过望远镜观察敌人...
AUG射击
请按任意键继续. . .