2023年8月25日,周五上午
今天上午学习设计模式中的策略模式时,发现这个有点像很多卡通片里面的变身器...
2023年8月26日,周六上午
更新:和简单工厂模式结合
目录
用策略模式写主角的变身器
#include<iostream>
//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public:
//Shapeshift是变身的意思
virtual void Shapeshift()=0;
};
//变成超能兽
class Wildmutt:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!超能兽!"<<std::endl;
}
};
//变成四手霸王
class FourArms:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!四手霸王!"<<std::endl;
}
};
//变成小奇兵
class GreyMatter:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!小奇兵!"<<std::endl;
}
};
//变成快闪之星
class Kineceleran:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!快闪之星!"<<std::endl;
}
};
//主角手上那个手表变身器就叫Omnitrix
class Omnitrix{
AlienHero *ah;
public:
Omnitrix(AlienHero *ah){
this->ah=ah;
}
//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!
void push(){
ah->Shapeshift();
}
};
int main(){
//变身超能兽!!!
Omnitrix omx(new Wildmutt());
omx.push();
}
使用策略模式的好处
使用策略模式的好处是,
当我需要添加一种新的外星英雄——Upgrade(变形怪)时,
我不需要改动里面的任何代码,只需要基于抽象类AlienHero再添加一个新类Upgrade就可以了。
#include<iostream>
//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public:
//Shapeshift是变身的意思
virtual void Shapeshift()=0;
};
//变成超能兽
class Wildmutt:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!超能兽!"<<std::endl;
}
};
//变成四手霸王
class FourArms:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!四手霸王!"<<std::endl;
}
};
//变成小奇兵
class GreyMatter:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!小奇兵!"<<std::endl;
}
};
//变成快闪之星
class Kineceleran:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!快闪之星!"<<std::endl;
}
};
//*******************************
// 新添加的类
//********************************
//变成变形怪
class Upgrade:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!变形怪!"<<std::endl;
}
};
//主角手上那个手表变身器就叫Omnitrix
class Omnitrix{
AlienHero *ah;
public:
Omnitrix(AlienHero *ah){
this->ah=ah;
}
//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!
void push(){
ah->Shapeshift();
}
};
int main(){
//变身变形怪!!!
Omnitrix omx(new Upgrade());
omx.push();
}
和简单工厂模式结合
虽然使用策略模式很方便修改,
但每次变身还要自己手动new一个外星英雄对象,太麻烦了。
能不能直接输入外星英雄名字就变身?
可以结合简单工厂模式,让程序来根据外星英雄名字自动new一个外星英雄对象。
这次我只改动了Omnitrix类
#include<iostream>
//alien hero是外星英雄的意思
//在《少年骇客》中,主角可以通过变身器变成10种外星英雄
class AlienHero{
public:
//Shapeshift是变身的意思
virtual void Shapeshift()=0;
};
//变成超能兽
class Wildmutt:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!超能兽!"<<std::endl;
}
};
//变成四手霸王
class FourArms:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!四手霸王!"<<std::endl;
}
};
//变成小奇兵
class GreyMatter:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!小奇兵!"<<std::endl;
}
};
//变成快闪之星
class Kineceleran:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!快闪之星!"<<std::endl;
}
};
//*******************************
// 新添加的类
//********************************
//变成变形怪
class Upgrade:public AlienHero{
public:
void Shapeshift(){
std::cout<<"变身!变形怪!"<<std::endl;
}
};
//******************
//把简单工厂写在Omnitrix类里面
//******************
//主角手上那个手表变身器就叫Omnitrix
class Omnitrix{
AlienHero *ah;
public:
Omnitrix(std::string alienHeroName){
//因为C++中的switch不支持std::string,所以我用了if-else
if(alienHeroName=="超能兽")
ah=new Wildmutt();
else if(alienHeroName=="四手霸王")
ah=new FourArms();
else if(alienHeroName=="小奇兵")
ah=new GreyMatter();
else if(alienHeroName=="快闪之星")
ah=new Kineceleran();
else if(alienHeroName=="变形怪")
ah=new Upgrade();
else
ah=nullptr;
}
//在手表变身器上选好英雄后,按下手表变身器中间的按钮变身!
void push(){
ah->Shapeshift();
}
};
int main(){
//变身变形怪!!!
Omnitrix omx("变形怪");
omx.push();
}
不过,当再次添加一个新的外星英雄时,
Omnitrix类的if-else也要进行更新。