首页 > 编程语言 >设计模式<c++> (1)策略模式

设计模式<c++> (1)策略模式

时间:2023-12-23 16:56:21浏览次数:43  
标签:设计模式 策略 void 模式 Code Duck include public View

一、定义

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

二、使用场景

  客户需要很多种鸭子。

  要求:

    1.每种鸭子都要会游泳。

    2.每种鸭子有叫和飞的行为。

    3.鸭子的叫和飞的行为可以在使用时动态的设置。

  思考:有绿头鸭、红头鸭、橡皮鸭、木头鸭。。。可能有N多种鸭子,我们如何设计,来满足上面的要求呢?

三、客户使用代码实现

  

我们可能封装了18个飞的算法、22个叫的算法,每种类型的算法之间可以相互替换而不影响其他的功能。如上,可以随便改鸭子的飞和叫的行为(算法)。这是策略模式牛逼之处。

四、具体实现

  1)项目结构

    

  2)鸭子飞的行为(算法)相关

  FlyBehavior.h

1 #pragma once
2 #include <iostream>
3 class FlyBehavior
4 {
5 public:
6     virtual void fly()=0;
7 };
View Code

  FlyNoWay.h

#pragma once
#include "FlyBehavior.h"
class FlyNoWay :
    public FlyBehavior
{
    void fly() override;
};
View Code

  FlyNoWay.cpp

#include "FlyNoWay.h"
void FlyNoWay::fly() {
    std::cout << "不会飞!" << std::endl;
}
View Code

  FlyRocketPowered.h

#pragma once
#include "FlyBehavior.h"
class FlyRocketPowered :
    public FlyBehavior
{
    void fly() override;
};
View Code

  FlyRocketPowered.cpp

#include "FlyRocketPowered.h"

void FlyRocketPowered::fly() {
    std::cout << "用火箭动力飞!" << std::endl;
}
View Code

  FlyWithWings.h

#pragma once
#include "FlyBehavior.h"
class FlyWithWings :
    public FlyBehavior
{
    void fly() override;
};
View Code

  FlyWithWings.cpp

#include "FlyWithWings.h"
void FlyWithWings::fly() {
    std::cout << "用翅膀飞!" << std::endl;
}
View Code

   3)鸭子叫的行为(算法)相关

  QuackBehavior.h

#pragma once
#include <iostream>
class QuackBehavior
{
public:
    virtual void quack()=0;
};
View Code

  QuackMute.h

#pragma once
#include "QuackBehavior.h"
class QuackMute :
    public QuackBehavior
{
    void quack() override;
};
View Code

  QuackMute.cpp

#include "QuackMute.h"
void QuackMute::quack() {
    std::cout << "<嘘~~ 我不发声>" << std::endl;
}
View Code

  QuackOnly.h

#pragma once
#include "QuackBehavior.h"
class QuackOnly :
    public QuackBehavior
{
    void quack() override;
};
View Code

  QuackOnly.cpp

#include "QuackOnly.h"

void QuackOnly::quack(){
    std::cout << "呱呱呱~~" <<std::endl;
}
View Code

  4)鸭子类

  Duck.h

#pragma once
#include <iostream>
#include "FlyBehavior.h"
#include "QuackBehavior.h"

class Duck
{
public:
    FlyBehavior* m_pFlyBehavior;
    QuackBehavior *m_pQuackBehavior;

    virtual void display()=0;
    void performFly();
    void performQuack();
    void swim();
    void setFlyBehavior(FlyBehavior *);
    void setQuackBehavior(QuackBehavior *);
};

  Duck.cpp

#include "Duck.h"
void Duck::performFly() {
    m_pFlyBehavior->fly();
}
void Duck::performQuack() {
    m_pQuackBehavior->quack();
    }
void Duck::swim() {
    std::cout << "所有的鸭子都可以游泳,就在Duck基类中." << std::endl;
}
void Duck::setFlyBehavior(FlyBehavior* behavior) {
    m_pFlyBehavior = behavior;
}
void Duck::setQuackBehavior(QuackBehavior* behavior) {
    m_pQuackBehavior = behavior;
}

  DuckMallard.h (绿头鸭)

#pragma once
#include "Duck.h"
#include "FlyWithWings.h"
class DuckMallard :
    public Duck
{
public:
    DuckMallard();
     void display() override;
};

  DuckMallard.cpp

#include "DuckMallard.h"
#include "QuackOnly.h"

DuckMallard::DuckMallard(){
    m_pFlyBehavior = new FlyWithWings();
    m_pQuackBehavior = new QuackOnly();
 }

void DuckMallard::display(){
    std::cout << "我是绿头鸭!" << std::endl;
}

  DuckModel.h(模型鸭)

#pragma once
#include "Duck.h"
class DuckModel :
    public Duck
{
public:
    DuckModel();
    void display() override;
};

  DuckModel.cpp

#include "DuckModel.h"
#include "FlyNoWay.h"
#include "QuackMute.h"
DuckModel::DuckModel() {
    m_pFlyBehavior = new FlyNoWay();
    m_pQuackBehavior = new QuackMute();

}
void DuckModel::display() {
    std::cout << "我是模型鸭!" << std::endl;

}

标签:设计模式,策略,void,模式,Code,Duck,include,public,View
From: https://www.cnblogs.com/airduce/p/17923288.html

相关文章

  • 设计模式之单例模式
    单例模式(单例模式)定义==单例模式==确保一个类只有一个实例,并提供一个全局访问点。单例模式实现的方式1.饿汉式publicclassHungry{//构造器私有privateHungry(){}//类加载时就初始化,主动创建privatestaticHungryhungry=newHungry();......
  • 设计模式—工厂模式
    介绍代码接口创建Shape接口publicinterfaceShape{voiddraw();}实现类创建Shape接口的三个实现类:Cirle、Rectangle、SquarepublicclassCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Circle");}}......
  • 短视频app开发,集群容错策略的代码分析
    短视频app开发,集群容错策略的代码分析1FailoverFailover故障转移策略作为默认策略,当短视频app开发中的消费发生异常时通过负载均衡策略再选择一个生产者节点进行调用,直到达到重试次数。即使业务代码没有显示重试,也有可能多次执行消费逻辑从而造成重复数据:publicclass......
  • 26.基于 page object 模式的测试框架优化实战
    目录异常处理(弹窗黑名单)日志记录报告生成测试数据的数据驱动异常弹框处理定义黑名单列表处理弹框#声明一个黑名单defblack_wrapper(fun):defrun(*args,**kwargs):basepage=args[0]try:returnfun(*args,**kwargs)......
  • 设计模式—适配器模式
    介绍代码接口定义媒体播放器接口MediaPlayer,其中play方法用于播放媒体文件publicinterfaceMediaPlayer{publicvoidplay(StringaudioType,StringfileName);}定义高级播放器接口AdvancedMediaPlayer,规定指定类型媒体的播放方法publicinterfaceAdvancedMe......
  • linux-firewalld 和iptable的策略配置(nat 以及端口开放)
    一、配置防火墙开发端口1、sudoyuminstallfirewalldsudosystemctlstartfirewalldsudosystemctlenablefirewalld2、配置防火墙规则firewall-cmd--permanent--add-service=sshfirewall-cmd--permanent--add-service=httpfirewall-cmd--permanent......
  • 一文看懂java单例模式
    ​ Java单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在Java中,有多种方式可以实现单例模式,下面详细介绍其中的几种常见实现方式。1什么是创建型设计模式?处理对象创建的模式,简答的理解就是如何创建对象?很多人都会想到new......
  • 在 Linux 上以 All-in-One 模式安装 KubeSphere
    1、什么是KubeSphere KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的IT自动化运维能力,简化企业的DevOps工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)......
  • javaweb中的设计模式
    1.监听器基于观察者模式。1.myTestEvent自定义事件。被观察者publicclassMyTestEventextendsApplicationEvent2.MyNoAnnotationListener自定义监听器。观察者@ComponentpublicclassMyNoAnnotationListenerimplementsApplicationListener<MyTestEvent>{@Override......
  • 责任链模式
    #include<iostream>#include<string>#include<sstream>usingnamespacestd;template<classT>stringMyConvertToString(Tvalue){stringstreamss;ss<<value;returnss.str();}//顶层的抽象类,规范了击鼓传花的组合能力classH......