推荐一下做图文的网站,html简单的个人网页代码,百度app,十大货源网站大全本文介绍策略模式以及使用函数式编程替代简单的策略模式。
策略模式 在策略模式#xff08;Strategy Pattern#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略#xff0c;并将每个算法封装在独立…本文介绍策略模式以及使用函数式编程替代简单的策略模式。
策略模式 在策略模式Strategy Pattern中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略并将每个算法封装在独立的类中使得它们可以互相替换。通过使用策略模式可以在运行时根据需要选择不同的算法而不需要修改客户端代码。 在策略模式中我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 上面这段话来自菜鸟教程。简单来说就是一种封装。Context需要执行某种算法但是Context无法构造出算法的细节于是Context需要找Concrete Strategy类获取不同的Concrete Strategy类对应不同的算法因为他们继承自一个公共的Abstract Strategy。 作为行为型模式的一种这个还是一个比较好理解的设计模式至少对我来说。我大概看了介绍就写了写C的实现
首先定义一个公共的父类
struct AbsBaseStrategy
{
public:virtual void show() 0;
};然后写两个子类继承
struct SpecificStrategy1 : AbsBaseStrategy
{
public:void show() override{cout SpecificStrategy1 show endl;}
};struct SpecificStrategy2 : AbsBaseStrategy
{
public:void show() override{cout SpecificStrategy2 show endl;}
};写一个公共的上下文调用策略类的方法。我比较懒这里就用智能指针了。引用的写法是类似的
struct TradStrategyCtxt
{
public:TradStrategyCtxt(shared_ptrAbsBaseStrategy strategy) : m_strategy(strategy){};void ctxtShow(){m_strategy-show();}private:shared_ptrAbsBaseStrategy m_strategy;
};然后使用的时候直接传递具体的对象进来就行
int main()
{TradStrategyCtxt ctxt1(make_sharedSpecificStrategy1());TradStrategyCtxt ctxt2(make_sharedSpecificStrategy2());ctxt1.ctxtShow();ctxt2.ctxtShow();
}函数式编程下的策略模式
事实上如果只是调用某一个或者少量某几个具体的方法我们大可不必非得传一个类进来。不同的策略类唯一的意义就是对接口函数进行包装那如果直接把函数指针传入也是可以的。还是上面的例子。
我们使用两个函数代替两个具体的策略类
void show1()
{cout SpecificStrategy1 show endl;
};void show2()
{cout SpecificStrategy2 show endl;
};在Context中直接传入函数指针
struct TradStrategyCtxt
{
public:TradStrategyCtxt(functionvoid() func) : m_func(func){};void ctxtShow(){m_func();}private:functionvoid() m_func;
};调用的地方也不需要修改什么最后的效果是相同的
int main()
{TradStrategyCtxt ctxt1(show1);TradStrategyCtxt ctxt2(show2);ctxt1.ctxtShow();ctxt2.ctxtShow();
}