首页 > 其他分享 >行为设计模式-策略模式的优缺点

行为设计模式-策略模式的优缺点

时间:2023-12-17 17:31:44浏览次数:34  
标签:cout 优缺点 模式 public m1 设计模式 Method Market mPtr

策略模式的作用就是把具体的算法实现从业务逻辑中剥离出来,成为一系列独立的算法类,使得他们可以相互替换。

行为设计模式-策略模式的优缺点_C++类与对象

举个例子:平常生活中超时基本上都有活动,比如会员日全场9折,周年庆消费多少减多少,抽奖活动等等。

那么如果将业务具体落实在代码上,是不是可以用多个条件判断来封装具体的业务逻辑,if判断是一个解决方案,但是还有没有其他的解决方案呢?

可以使用策略模式来将其封装成特定的策略的类,一个策略一个类。

//抽象基类活动方法。
class Method
{
public:
	Method() {

		cout << "Method构造" << endl;
	}
	virtual ~Method() {

		cout << "Method析造" << endl;
	}
	//提供的 活动结算方法接口。
	virtual float calc(float &money) = 0;

};

//会员日活动
class VIPdayMethod:public Method
{
public:

	VIPdayMethod() {
		cout << "VIPdayMethod构造" << endl;
	}
	~VIPdayMethod() {

		cout << "VIPdayMethod析造" << endl;
	}

	float calc(float &money)override {
		if (money  > 0) {
			cout << "会员日做活动,全场9折!!!" << endl;
			cout << "已经享受活动折扣 " << endl;
			return money * 0.9;
		}
		return 0.0;
	}
};

//周年庆活动
class Anniversary:public Method
{
public:
	Anniversary() {
		cout << "Anniversary构造" << endl;
	}
	~Anniversary() {

		cout << "Anniversary析造" << endl;
	}

	float calc(float &money)override {

		cout << "周年庆做活动,满500立减50" << endl;
		cout << "您的购物金额为:" << money << endl;
		if (money >= 500) {
			cout << "已经享有周年庆活动" << endl;
			return money - 50;
		}
		return money;
	}
};

//超市结算,封装一个Method基类指针,以方便不同的子类活动 使用多态
class Market
{
public:
	Market(Method* ptr){
		this->mPtr_ = ptr;
		cout << "Market构造" << endl;
	}
	~Market() {
		cout << "Market析造" << endl;
	}
	
	void clacContext(float money) {
		
		cout << "您需要支付: " << mPtr_->calc(money) << endl;
	}

private:
	//基类指针
	Method* mPtr_ = nullptr;
};

int main()
{
	Market* m1 = new Market(new VIPdayMethod());
	m1->clacContext(200);

	cout << "***************" << endl;
	Market* m2 = new Market(new Anniversary);
	m2->clacContext(500);

	delete m1;
	m1 = nullptr;
	cout << "***************" << endl;
	delete m2;
	m2 = nullptr;


	return 0;
}

这里需要注意

行为设计模式-策略模式的优缺点_C++析构函数_02

发现没有调用到子类VIP和Aniversary的析构函数。为什么?

如果单纯的delete m1只是释放Market的指针

因为:

Market类中封装了Method* mPtr_ 

mPtr_又指向用户所创建的子类

所以怎么设计这个子类的delete释放操作呢?

只需要在Market类的析构函数中将mPtr_释放即可

~Market() {
		if (mPtr_ != nullptr) {
			delete mPtr_;
			mPtr_ = nullptr;
		}
		cout << "Market析造" << endl;
	}

那么调用到Market类析构函数时也就相应的释放掉mPtr_所指向的子类对象。

int main()
{
	Market* m1 = new Market(new VIPdayMethod());
	m1->clacContext(200);

	cout << "***************" << endl;
	Market* m2 = new Market(new Anniversary);
	m2->clacContext(500);

	delete m1;
	m1 = nullptr;
	cout << "***************" << endl;
	delete m2;
	m2 = nullptr;

	return 0;
}

行为设计模式-策略模式的优缺点_设计模式_03

总结:

优点:

  • 各自使用封装的算法,可以容易地引入新的算法来满足相同的接口
  • 算法的细节完全封装在 Strategy 类中,因此可以在不影响 Context 类的情况下更改算法的实现
  • 由于实现的是同一个接口,所以策略之间可以自由切换

缺点:

  • 客户端必须知道所有的策略,了解它们之间的区别,以便选择恰当的算法


标签:cout,优缺点,模式,public,m1,设计模式,Method,Market,mPtr
From: https://blog.51cto.com/u_15172160/8862630

相关文章

  • java状态模式
    1定义一个接口2publicinterfaceState{3publicvoidhandle();4}567/**8*具体的状态角色(下单)9*CreatedbyAdministrator10*/11publicclassPlaceAnOrderimplementsState{12//具体化状态的行为13@Override14publ......
  • 23种设计模式——模板模式
    今天我们来学习23种设计模式中的模板模式。模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。概念:模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法......
  • 涉及到 List 集合的查询优化时,通常需要考虑集合的大小、查询的复杂度以及数据访问的模
    Java开发中,当涉及到List集合的查询优化时,通常需要考虑集合的大小、查询的复杂度以及数据访问的模式。以下是一些常见的优化技巧。使用StreamAPI进行并行查询StreamAPI可以很容易地并行化查询操作,这对于大规模数据集的查询非常有用。以下是一个并行查询的示例:importjava.ut......
  • Python实现软件设计模式4:建造者模式
    特点建造者模式是一步一步构建一个复杂的对象,属于对象创建型模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示关注如何逐步地创建一个复杂的对象或产品,不同的创造者定义了不同的创建过程用户不需要知道内部的具体构造细节、只用指定复杂对象的类......
  • Python实现软件设计模式3:抽象工厂模式
    特点系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)在工厂方法模式中,只有一个产品等级结构一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构产品族是指由同一个工厂生产......
  • 设计模式概念和分类
    (设计模式概念和分类)概念设计模式一般是指软件开发人员在开发的时候遇到软件设计问题时的一般解决方案,这样当我们遇到重复问题的时候,就能够一次一次地使用该方案而避免了重复劳动。并且可以提高代码的可重用性和可读性,增强系统的可靠性和可维护性,解决一系列的复杂问题,提高协作效......
  • 结构性设计模式-适配器模式的优缺点
    把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。类的适配器模式对象的适配器模式对象适配器在上图中可以看出:冲突:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不兼容了)。解决方案:为使Target能够使用Ad......
  • [JS] JS单例模式的实现
    JS单例模式的实现单例模式简介单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,提供了一种创建对象的最佳方式。特点:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当......
  • LVS-DR模式
    DR数据包流向分析(1)客户端发送请求到DirectorServer(负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。(2)DirectorServer和RealServer在同一个网络中,数据通过二层数据链路层来传输。(3)内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据......
  • [CSharpTips]C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件
    C#控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.IO;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading;usingSystem.......