行为模式之策略模式(Strategy Pattern)(C++实现)

大话设计模式c++实现2——策略模式 Strategy Pattern 1.问题 商场收银软件,根据客户所购买的单价和数量,显示总价。会有打折、返利等活动,使得计算方式不同。界面设计如下: 2.分析 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。简单工厂模式解决方案: 简单工厂模式只是解决对象的创建问题,而且由于工厂本身包括了所有的收费方式,商场可能经常性的更改打折额度和返利 阅读详情

策略模式(Strategy Pattern).

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。Strategy模式将逻辑(算法)封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,通过委托的方式将抽象接口的实现委托给组合对象实现。

1.设计原则:

a.找出应用中的可能变化之处,把它们独立出来,不要和那些不需要变化的代码混起来。(系统的某部分的改变不会影响其他部分)。

b.针对接口编程(利用多态针对超类型(通常为抽象类)进行编程),而不是针对实现编程。把会变化的行为抽取出来变成单独的接口,构成行为类。

c.多用组合,少用继承.(鸭子的行为不是继承过来的而是通过行为对象组合过来的)


2继承和组合的优缺点:

 继承:

   a.优点:易于修改和扩展那些被复用的实现

   b.缺点:1)破坏了封装性,继承中父类的实现细节暴露给子类了;
2)“白盒”复用,原因在1)中;
3)当父类的实现更改时,其所有子类将不得不随之改变
4)从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。

组合

a.优点:

1)“黑盒”复用,因为被包含对象的内部细节对外是不可见的;2)封装性好,原因为1);

3)实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);

4)可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象

基类的指针)。

b.缺点:系统中对象过多。 从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor CompositionOver Inheritance)。


下面用C++实现《Head First设计模式》书中的鸭子模拟器的策略模式,类的关系图如下:



 头文件Duck.h

#ifndef _DUCK_H_
#define _DUCK_H_
#include "Behavior.h"
class Duck
{
public:
	Duck();
	~Duck();
	
	 void swim();   //所有的子类共有的行为
	 virtual void display();//子类必须覆盖
	 void performQuack();
	 void performFly();
     void setFlyBehavior(FlyBehavior *flyBehavior);
	 void setQuackBehavior(QuackBehavior *quackBehavior);

protected:
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;

};

class MallardDuck:public Duck
{
public:
    MallardDuck();
	virtual ~MallardDuck();
	void display();
protected:

private:

};



#endif //_DUCK_H_

源文件Duck.CPP

#include "Duck.h"
#include <iostream>
using namespace std;
Duck::Duck()
{

}
Duck::~Duck()
{    
	if(!flyBehavior)
		delete flyBehavior;
	if(!quackBehavior)
		delete quackBehavior;

	cout<<"~Duck()....."<<endl;
}
void Duck::swim()
{
cout<<"All ducks float,even decoys...."<<endl;
}
void Duck::display()
{
	cout<<"Duck::display()"<<endl;
}
void Duck::performFly()
{
	flyBehavior->fly();
	
}

void Duck::performQuack()
{
	quackBehavior->quack();
}

MallardDuck::MallardDuck()
{
  quackBehavior=new Quack();
  flyBehavior=new FlyWithWings();
}
MallardDuck::~MallardDuck()
{
cout<<"~MallardDuck()...."<<endl;

}
void MallardDuck::display()
{
	cout<<"I am a Mallard duck...."<<endl;
}

void Duck::setFlyBehavior(FlyBehavior *flyBehavior)
{
	this->flyBehavior=flyBehavior;
}
void Duck::setQuackBehavior(QuackBehavior *quackBehavior)
{
	this->quackBehavior=quackBehavior;
}

头文件Behavior.h
#ifndef _BEHAVIOR_H_
#define _BEHAVIOR_H_
//抽象基类
class FlyBehavior
{
public:
	FlyBehavior();
    virtual ~FlyBehavior();
	virtual void fly()=0;

};

class QuackBehavior
{
   
public:
	virtual void quack()=0;
};

//鸭子飞的行为
class FlyWithWings:public FlyBehavior
{
public:
    FlyWithWings();
virtual ~FlyWithWings();
	void fly();

};
class FlyNoWay:public FlyBehavior
{
public:
	void fly();
};
//鸭子叫的行为
class Quack:public QuackBehavior
{
public:
	void quack();
};
class MuteQuack:public QuackBehavior
{
public:
	void quack();
};

#endif

源文件Behavior.CPP

#include "Behavior.h"
#include <iostream>
using namespace std;


FlyBehavior::FlyBehavior()
{
}
FlyBehavior::~FlyBehavior()
{
	cout<<"~FlyBehavior()"<<endl;
}


FlyWithWings::FlyWithWings()
{

}
FlyWithWings::~FlyWithWings()
{
cout<<"~~FlyWithWings()"<<endl;
}
void FlyWithWings::fly()
{
	cout<<"I am flying..."<<endl;
}
void FlyNoWay::fly()
{
cout<<"I can't fly..."<<endl;
}



void Quack::quack()
{
cout<<"I am Quack"<<endl;
}

void MuteQuack::quack()
{
	cout<<"I am  MuteQuack..."<<endl;

}


主函数main.CPP代码

#include "Duck.h"
#include "Behavior.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	Duck * mallard=new MallardDuck();
	//mallard->setFlyBehavior(new FlyWithWings());
	mallard->display();
	mallard->swim();
	mallard->performFly();
	mallard->performQuack();
	mallard->setFlyBehavior(new FlyNoWay());
    mallard->performFly();
  if (NULL != mallard)
   delete mallard;
	return 0;
}

运行结果如下:




C++策略模式(Strategy Pattern) 意图 定义一系列的算法,把它们一个一个封装卡里,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 动机 需要换行功能的客户程序如果直接包含换行算法代码的话讲会变得复杂,这使得客户程序庞大并且难以维护,尤其当其需要支持多种换行算法时问题会更加严重。 不同的时候需要不同的算法,我们不想支持我们并不使用的换行算法。 当换行功能时客户程序的一个难以分割的成分时,增加新的换行算法或改变现在算法将十分困难。 ... 阅读详情

相关推荐

策略模式(设计模式)

(1) Strategy 类:定义所有支持的算法的公共接口,用纯虚函数定义抽象算法接口; (2) ConcreteStategy 类簇:封装了具体的算法或行为,继承自Strategy,各种策略的具体实现; (3) Context 类,持有一个策略类的引用,传入具体的ConcreteStategy来配置,最终给客户端调用。

1、策略模式(C++ 之 策略模式)

原地址:https://www.cnblogs.com/xinxue/p/5271184.html 1 会飞的鸭子 Duck 基类,含成员函数 Swim() 和 Display();派生类 MallardDuck,RedheadDuck 和 RubberDuck,各自重写 Display() class Duck { public: void Swim(); ...

wang13342322203的博客 909

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1748

策略设计模式 C++实现

策略模式体现了 “针对接口编程,而不是针对实现编程”,如有的鸭子会叫,有的鸭子不会叫,把鸭子叫的行为委托给(delegate)给 叫 的接口类去实现,而不是在 鸭子 的类中实现。

渲染引擎开发 755

癌症免疫治疗预测神器TIDE:从原理到实战(避坑指南)

本文详细解析了癌症免疫治疗预测工具TIDE的核心原理及实战应用。TIDE算法通过模拟肿瘤免疫逃逸的两种核心机制(T细胞功能障碍和排除),为临床决策提供精准预测。文章涵盖数据准备、标准化流程、网页工具操作指南及结果解读,帮助科研人员和临床医生避开常见误区,优化免疫治疗策略。

weixin_29309475的博客 196

MindIE与vLLM-Ascend性能对决:Qwen3在昇腾910B上的推理效率实测

本文深度对比了昇腾910B平台上两大推理框架MindIE与vLLM-Ascend的性能表现。通过实测Qwen3系列模型,详细分析了二者在单卡、多卡场景下的推理效率、扩展性及生产环境适用性,为AI算力基础设施选型提供关键参考。

weixin_29214335的博客 1181

23种设计模式之策略模式(c++实现)

定义 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 Strategy 模式典型的结构图为: 大家肯定看着很懵逼,其实第一次接触类图的时候我自己也是这样。 那么咱们举个例子来解释一下。 假设我们要实现一个角色游戏,context为所有角色的基类(例子的代码后面会实现,此处只是拿context举例,此处的context并不是基类)...

Sanjiye的博客 1632

【乐企文件生成工程】添加数据库、SpringEvent事件支持

更新!1、乐企版式文件生成工程添加数据库支持2、乐企版式文件生成工程添加事件机制,异步处理文件生成,提高系统并发能力。

九七的博客 336

C++设计模式一--StrategyPattern(策略模式)

C++ 设计模式 StrategyPattern 策略模式

雪狼的博客 1210

ctle电路求帮忙分析低中高频调节原理,搭好了电路该怎样调节参数?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1126

【异常】Claude Code 400错误(Extra inputs are not permitted)解决方案

摘要:Claude Code 2.0.37+版本因API请求包含未支持的custom.input_examples参数导致400错误,使核心功能失效。解决方案是降级至稳定版v2.0.32:先卸载当前版本(npm uninstall -g @anthropic-ai/claude-code),再安装指定版本(npm install -g @anthropic-ai/claude-code@2.0.32),最后验证请求是否恢复正常。该问题确认在v2.0.32版本不存在。(148字)

奶爸的编程之路,也就一周冷个三天 2037

【c++设计模式22】行为模式7:策略模式(Strategy Pattern)

原创作者:郑同学的笔记原创地址:https://zhengjunxue.blog.youkuaiyun.com/article/details/132920283qq技术交流群:921273910# 一、定义策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。客户端代码在运行时选择所需的算法。

junxuezheng的博客 2042

YOLOv8【第一章:基础入门篇·第1节】一文搞定,核心架构深度解析与环境配置!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 2101

C++设计模式——策略模式(Strategy Pattern)

C++设计模式——策略模式(Strategy Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——策略模式(Strategy Pattern)目录定义实现示例传统的策略模式实现使用函数指针实现策略模式工厂模式和策略模式对比总结参考资料 定义 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式是指定

leonardohaig的博客 4769

【开源电机驱动】位置环控制

这是三闭环里的最后一个:位置闭环控制。如果你认真的阅读并推导了前章节,那么这一节将会很好理解。一如既往,我会使用简练的语言来描述复杂的问题。本章节主要涉及位置环的一些概念,以及控制框图。文章不会涉及具体的代码。

BadBoyHolly的博客 6094

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++设计模式——策略模式(strategy pattern)

一、原理讲解 1.1意图 定义算法簇,将这些算法封装起来,之间可以相互替换。这样的好处在于,使得算法可以独立于使用它的客户而变化。 1.2与模板方法区别 模板方法主要是继承接口类,而策略模式主要是组合接口类,两种方法核心区别在于,是继承?还是组合? 设计模式八大原则之一:优先使用对象组合,而不是类继承。 1.3设计步骤 a1 先定义一个接口类最为抽象基类ABC a2 定义一系列算法...

净无邪博客 1274

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【设计模式】——策略模式(Strategy Pattern)

策略模式是一种强大的设计模式,它通过定义一系列的算法族,并将每一个算法封装起来,使它们可以互相替换,从而提高了算法的灵活性和可重用性。在C++中实现策略模式时,我们需要定义抽象策略类、具体策略类和环境类,并通过环境类来调用具体的策略。策略模式的应用场景广泛,包括但不限于多种排序算法、多种支付方式、日志记录策略和缓存策略等。此外,策略模式还可以与其他设计模式结合使用,以应对更复杂的场景。通过合理使用策略模式,我们可以编写出更加灵活、可维护和可扩展的代码。

J^T的博客 1235

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

(三)行为模式:10、策略模式(Strategy Pattern)(C++示例)

介绍策略模式的含义,应用场景,优缺点,以及C++实现的实例。

bigger_belief的博客 403

C++实现策略模式Strategy Pattern

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

优快云er_2015的博客 613

设计模式-策略模式-Strategy Pattern

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式的优点包括算法的封装和切换的灵活性,以及算法可独立于使用它的客户端变化。:如果算法的实现非常复杂,或者算法可能会随着时间而变化,策略模式可以帮助管理这种复杂性,使得算法的变化不会影响到使用算法的代码。:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。

wesigj的博客 1455

策略模式(Strategy Pattern)就这么简单

0x00 举个生活中的例子某个大人网站是会员制的,金牌会员购买精神食粮打7折,银牌会员打8折,铜牌会员打9折,铁牌会员不打折。也就是说不同的用户在购买精神食粮的时候结算的价格是不一样的,即使你们买相同公司出品的相同食粮,你们的总价格是不一样的,因为根据会员等级不同,有不同的折扣。也就是说,面对不同会员等级的用户,大人网站会有不同的计价算法。问过度娘的人都知道,假如你经常问度娘哪里有可堪一撸的资源,此

人王的专栏 6831

设计模式 策略模式(Strategy Pattern) C++表达

策略模式(Strategy Pattern)是一种行为设计模式,它的核心思想是将一系列相关的算法或行为封装到独立的策略类中,并使得这些策略可以相互替换。主要用来定义一系列可互换的算法或行为。它允许在运行时选择和切换这些算法或行为,而不用修改使用它们的代码。策略模式就像给的代码提供了一组不同的工具,每个工具都可以完成相似的工作(例如不同的送货方式)。可以根据需要随时更换这些工具,而不需要修改太多代码。

二分掌柜的 1141

策略模式(Strategy Pattern)

策略模式定义:策略模式定义了算法族,将算法分别封装起来,让他们之间可以互相替换。此模式让算法的变化独立于使用算法的客户我们来看一个商场打折的例子public interface Discount { public double reduce(double total); } public class Derate implements Discount { // 8折 p...

怀揣梦想,努力前行 1967

(C++实现)——策略模式(Strategy Pattern)

概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。 类图与实例: Co

晴天的专栏 1192

设计模式【14】——策略模式( Strategy 模式)

Strategy 模式和 Template 模式要解决的问题是相同的,都是为了给业务逻辑具体实现和抽象接口之间的解耦。Strategy 模式将逻辑封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。继承:易于修改和扩展那些被复用的实现。

sinat_42974726的博客 356

利用Strategy Pattern(策略模式)替换switch case

参考文档: http://blogs.microsoft.co.il/gilf/2009/11/22/applying-strategy-pattern-instead-of-using-switch-statements/ 用switch case的缺点: 代码臃杂,经常一个case能写很多行,代码不易阅读 每次在使用switch case语句的时候,都应该考虑,能不能使用策略模式替代switc...

alexhu2010q的博客 2753
上一篇: 英文科技论文中经常出现短语的含义总结
下一篇: 行为模式之观察者模式(Observer Pattern)(C++实现)******
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值