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

发布时间 2023-12-23 16:47:10作者: 一梦、

一、定义

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

二、使用场景

  客户需要很多种鸭子。

  要求:

    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