博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式 C++实现
阅读量:5020 次
发布时间:2019-06-12

本文共 2311 字,大约阅读时间需要 7 分钟。

策略(Strategy)模式

Strategy pattern in LePUS3 (legend)     策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,比如每个人都要“交个人所得税”,但是“在美国交个人所 得税”和“在中国交个人所得税”就有不同的算税方法。策略模式让算法独立于使用它的客户而独立变化。

 

其主要实现方法就是将某些某些功能属性从目标对象中解耦出来构成单独的功能对象,目标对象可以根据需求组合不同的功能对象。下面示例将鸭子的飞行和呱呱叫功能从鸭子中解耦出来,使用组合而不是继承来实现。鸭子的子类在继承鸭子的时候可以根据需求自由的选择飞行和呱呱叫的实现类。

 

#include 
class FlyBehaviour;class QuackBehavior;class Duck{public: Duck(); ~Duck(); virtual void display() = 0; void setFlyBehaviour(std::shared_ptr
& behavior); void setQuackBehavior(std::shared_ptr
& behavior); void performFlyBehaviour(); void performQuackBehavior();protected: std::shared_ptr
m_flyBehavior; std::shared_ptr
m_quackBehavior;};
#include "FlyBehaviour.h"#include "QuackBehavior.h"Duck::Duck(){}Duck::~Duck(){}void Duck::setFlyBehaviour(std::shared_ptr
& behavior){ m_flyBehavior = behavior;}void Duck::setQuackBehavior(std::shared_ptr
& behavior){ m_quackBehavior = behavior;}void Duck::performFlyBehaviour(){ m_flyBehavior->fly();}void Duck::performQuackBehavior(){ m_quackBehavior->quack();}
class FlyBehaviour{public:    FlyBehaviour();    ~FlyBehaviour();    virtual void fly() = 0;};
#include "FlyBehaviour.h"class FlyWithWings : public FlyBehaviour{public:    FlyWithWings();    ~FlyWithWings();    virtual void fly();};
FlyWithWings::FlyWithWings(){}FlyWithWings::~FlyWithWings(){}void FlyWithWings::fly(){    std::cout << "I can fly with wings" << std::endl;}
#include "Duck.h"class RedDuck : public Duck{public:    RedDuck();    ~RedDuck();    void display();};
#include "RedDuck.h"#include 
#include "FlyWithWings.h"#include "Squeak.h"RedDuck::RedDuck(){ std::shared_ptr
flyB(new FlyWithWings()); std::cout << "behavior counter " << flyB.use_count() << std::endl; setFlyBehaviour(flyB); std::cout << "behavior counter " << flyB.use_count() << std::endl; std::shared_ptr
quackB(new Squeak()); setQuackBehavior(quackB);}RedDuck::~RedDuck(){}void RedDuck::display(){ std::cout << "I am a red duck!" << std::endl; performFlyBehaviour(); performQuackBehavior();}

 

转载于:https://www.cnblogs.com/vectorli/p/4495357.html

你可能感兴趣的文章
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>