【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式

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也要进行更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值