开始学习设计模式,今天的是策略模式。
主要参考:《大话设计模式》,博客https://blog.csdn.net/wuzhekai1985/article/details/6665197
引用:
-
策略模式是一种定义一系列算法的方法,所有这些算法完成的都是相同的工作, 只是实现不同,可以用相同的方式调用所有的算法,减少了算法类之间的耦合。
-
策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
-
在实践中, 只要在分析过程中需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
这里用简单的吃饭问题。每天晚上都要想,晚上吃什么?简单代码实现:
先给出晚上吃饭不同的算法定义:
class Food
{
public:
Food() {}
virtual ~Food() = 0;
virtual void eat() = 0;
};
class Rice : public Food
{
public:
// 通过 Food 继承
~Rice()
{}
virtual void eat() override
{
cout << "吃米饭" << endl;
}
};
class Noodle : public Food
{
public:
~Noodle() {}
// 通过 Food 继承
virtual void eat() override
{
cout << "吃面条" << endl;
}
};
有两种实现方式,一种简单工厂,一种使用模板。
简单工厂:
class Dinner
{
public:
enum select
{
RICE,
NOODLE,
BUN
};
Dinner(select what)
{
if (what == RICE)
{
food = new Rice();
}
else if (what == NOODLE)
{
food = new Noodle();
}
else
{
}
}
void eatDinner()
{
food->eat();
}
~Dinner()
{
if (food != nullptr)
{
delete food;
food = nullptr;
}
}
private:
Food *food;
};
int main()
{
Dinner *dinner = nullptr;
//晚餐吃米饭
dinner = new Dinner(Dinner::RICE);
dinner->eatDinner();
delete dinner;
dinner = nullptr;
//晚餐吃面条
dinner = new Dinner(Dinner::NOODLE);
dinner->eatDinner();
delete dinner;
dinner = nullptr;
system("pause");
return 0;
}
模板:
template <class T>
class Dinner
{
public:
Dinner()
{
food = new T();
}
void eatDinner()
{
food->eat();
}
~Dinner()
{
if (food != nullptr)
{
delete food;
food = nullptr;
}
}
private:
Food *food;
};
int main()
{
Dinner<Rice> *rdinner = new Dinner<Rice>();
rdinner->eatDinner();
delete rdinner;
rdinner = nullptr;
Dinner<Noodle> *ndinner = new Dinner<Noodle>();
ndinner->eatDinner();
delete ndinner;
ndinner = nullptr;
system("pause");
return 0;
}