设计模式笔记:策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它将一组行为封装到一个系列的对象中,作为一个策略,这些对象之间可以相互替换,让程序的主体对象能够改变它的行为方式,并且能够根据需要动态地选择其中的一种行为。

在C++中,我们可以利用类和接口(抽象基类)来实现策略模式。

下面是一个策略模式的简单实现示例。假设我们有一个交通工具选择应用,用户可以根据自己的需求选择不同的交通工具。

首先,我们定义一个交通工具的接口:

1
2
3
4
5
6
7
cppCopy code
class TravelStrategy
{
public:
virtual ~TravelStrategy() = default;
virtual void travel() = 0; //纯虚函数
};

然后,我们可以定义一些具体的策略,比如步行、自行车、驾车:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class WalkingStrategy : public TravelStrategy
{
public:
void travel() override
{
std::cout << "Traveling by walking" << std::endl;
}
};

class BicycleStrategy : public TravelStrategy
{
public:
void travel() override
{
std::cout << "Traveling by bicycle" << std::endl;
}
};

class CarStrategy : public TravelStrategy
{
public:
void travel() override
{
std::cout << "Traveling by car" << std::endl;
}
};

接着,我们定义一个旅行者类,它可以使用不同的旅行策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Traveler
{
private:
TravelStrategy* strategy;
public:
Traveler(TravelStrategy* initialStrategy) : strategy(initialStrategy) {}

void setStrategy(TravelStrategy* newStrategy)
{
if(strategy)
delete strategy;
strategy = newStrategy;
}

void travel()
{
if(strategy)
strategy->travel();
}

~Traveler()
{
if(strategy)
delete strategy;
}
};

现在,我们可以创建一个旅行者对象,并根据需要改变其旅行策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
Traveler traveler(new WalkingStrategy());
traveler.travel(); // Output: Traveling by walking

traveler.setStrategy(new BicycleStrategy());
traveler.travel(); // Output: Traveling by bicycle

traveler.setStrategy(new CarStrategy());
traveler.travel(); // Output: Traveling by car

return 0;
}

这就是策略模式的一个基本实现。它让我们可以独立地更改对象的行为,使其更加灵活和可扩展。