01.思维导图
02.将鸟笼放飞所有鸟类的题,改成观察者模式
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>//写一个鸟类:有一个多态函数:run
//写一个企鹅类,继承自鸟类:重写run 函数
//写一个鸵鸟类,继承自你啊嘞,重写run
//写一个老鹰类,继承自鸟类,重写run
//写一个鸟笼,能够存放 不同的鸟类对象
//鸟笼是什么类型的自己想
//鸟笼初始化的时候,4个不同的鸟类,至少有一个对象在鸟笼里面
//写一个函数,叫做 opencage
//实现效果:放跑里面的所有鸟类,让所有鸟runusing namespace std;//鸟类基类,同时作为观察者接口
class Bird{
private:public://多态函数,不同鸟类有不同行为virtual void run()=0;virtual ~Bird(){}
};//企鹅类
class qier:public Bird{
public:void run(){cout<<"01.企鹅:我不会飞,但我会游泳"<<endl;}};//鸵鸟类
class tuoniao:public Bird{
public:void run(){cout<<"02.鸵鸟:我不会飞,但我会奔跑"<<endl;}};//老鹰类
class laoying:public Bird{
public:void run(){cout<<"03.老鹰:我能翱翔天空并俯冲捕猎"<<endl;}};//鸟笼类
class BirdCage{
private:Bird* list[10];int len=0;
public://将鸟添加到鸟笼void addBird(Bird* bird){list[len]=bird;len++;}//打开鸟笼,通知所有鸟执行run方法void open_the_cage(){cout<<"00.打开鸟笼释放鸟类"<<endl;for(int i=0;i<3;i++){list[i]->run();}}
};int main(int argc, const char** argv)
{//创建不同的鸟类对象qier q;tuoniao t;laoying l;//创建鸟笼并添加鸟类对象BirdCage cage;cage.addBird(&q);cage.addBird(&t);cage.addBird(&l);//打开鸟笼cage.open_the_cage();return 0;
}
03.
使用 策略模式 + 简单工厂模式实现以下功能
有一个英雄类,拥有私有成员: hp ,atk,dep
英雄可以打怪掉落武器:怪物可以掉落3种武器:
长剑,匕首,斧头
英雄装备长剑,获得2点hp
英雄装备匕首,获得2点atk
英雄装备斧头,获得2点def
英雄装备不同的武器,使用策略模式去实现
注意:测试的时候,英雄在更换武器的时候,记得使用策略模式,将英雄之间装备的武器属性扣除后,再增加新属性
打败怪物掉落什么武器,自己设计,但是要求怪物掉落武器是一个简单工厂模式
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>using namespace std;//武器策略接口
class WeaponStrategy{
public://纯虚函数virtual void equip(class Hero& hero)=0;virtual void unequip(class Hero& hero)=0;//虚析构函数virtual ~WeaponStrategy(){}//virtual ~WeaponStrategy()=default;
};//英雄类
class Hero{
private:int hp;int atk;int def;WeaponStrategy* currentWeapon;
public://Hero构造函数的初始化Hero(int hp=100,int atk=10,int def=5):hp(hp),atk(atk),def(def),currentWeapon(nullptr){}//Hero 武器拾取void equipWeapon(WeaponStrategy* weapon){if(currentWeapon){currentWeapon->unequip(*this);//释放之前武器的内存delete currentWeapon;}weapon->equip(*this);currentWeapon=weapon;}void showStats() const{cout<<"HP:"<<hp<<",ATK:"<<atk<<",DEF"<<def<<endl;}int& getHp(){return hp;}int& getAtk(){return atk;}int& getDef(){return def;}//添加释放武器内存的公共方法void releaseWeapon(){if(currentWeapon){currentWeapon->unequip(*this);delete currentWeapon;currentWeapon=nullptr;}}
};
//长剑策略类
class LongSword:public WeaponStrategy{
public:void equip(Hero& hero){hero.getHp()+=2;cout<<"装备长剑,HP增加2"<<endl; }void unequip(Hero& hero){hero.getHp()-=2;cout<<"卸下长剑,HP减少2"<<endl;}
};//匕首策略类
class Dagger:public WeaponStrategy{
public:void equip(Hero& hero){hero.getAtk()+=2;cout<<"装备匕首,ATK增加2"<<endl;}void unequip(Hero& hero){hero.getAtk()-=2;cout<<"卸下匕首,ATK减少2"<<endl;}
};//斧头策略类
class Axe:public WeaponStrategy{
public:void equip(Hero& hero){hero.getDef()+=2;cout<<"装备斧头,DEF增加2"<<endl;}void unequip(Hero& hero){hero.getDef()-=2;cout<<"卸下斧头,DEF减少2"<<endl;}
};//武器工厂类
class WeaponFactory{
public:static WeaponStrategy* createWeapon(int type){switch(type){case 1:return new LongSword();case 2:return new Dagger();case 3:return new Axe();default:return nullptr;}}
};//怪物类
class Monster{
public://打败怪物后掉落武器WeaponStrategy* dropWeapon(){//随机生成1到3之间的整数,代表不同武器类型int weaponType=rand()%3+1;return WeaponFactory::createWeapon(weaponType);}
};int main(int argc, const char** argv)
{Hero hero;cout<<"初始属性:";hero.showStats();Monster monster;for(int i=0;i<5;i++){cout<<"\n第"<<i+1<<"次打败怪兽,怪物掉落武器..."<<endl;WeaponStrategy* droppedWeapon=monster.dropWeapon();hero.equipWeapon(droppedWeapon);cout<<"当前属性:";hero.showStats();}//调用公共方法释放武器内存hero.releaseWeapon();return 0;
}