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;
}