一、简介
设计模式作为一种思维方式,我更喜欢用简单的语言表达,主打思想即可,无需在意实现的编程语言。我认为
策略模式 是利用函数的
重写
特性来实现多个算法(策略)后,再利用一个环境类来统一封装,这样使得算法可以独立于用户的使用(环境类)而变化(策略类)的一种思维方式;
二、代码讲解
由于刚好用C#写工具,下面就用C#代码作为展示吧,主要是思维,选择那种编程语言不影响。
csharp
//设置一个策略接口,用于给具体策略来"重写"方法。
interface Strategy
{
void myExpress();
}
//策略A:实现算法方式一
class A_Strategy : Strategy
{
public void myExpress()
{
Console.WriteLine("this is a A_Strategy");
}
}
//策略B:实现算法方式二
class B_Strategy : Strategy
{
public void myExpress()
{
Console.WriteLine("this is a B_Strategy");
}
}
//策略C:实现算法方式三
class C_Strategy : Strategy
{
public void myExpress()
{
Console.WriteLine("this is a C_Strategy");
}
}
//使用环境类进行封装,用户的使用对象
class Pakagestrategy
{
//核心:要想将多个类统一封装,必须使用接口类。
Strategy strategy;
public Pakagestrategy(Strategy strategy)
{
//核心:通过接口类的重写,这里的对应可以是任意具体策略类的对象
this.strategy = strategy;
}
//核心:利用重写特征,用一个函数PackeMyEpxress,包装了多个myExpress;
public void PackeMyEpxress()
{
this.strategy.myExpress();
}
}
//用户类
class user
{
public void userMethod()
{
//用户通过环境类Pakagestrategy来执行对应的算法(策略);
Pakagestrategy pakagestrategyA = new Pakagestrategy(new A_Strategy());
pakagestrategyA.PackeMyEpxress();
//再不改变环境类的情况下,我们可以不断重写更多算法,让用户可以使用一样的接口,但根据参数的不同实现功能多能;
Pakagestrategy pakagestrategyB = new Pakagestrategy(new B_Strategy());
pakagestrategyB.PackeMyEpxress();
Pakagestrategy pakagestrategyC = new Pakagestrategy(new C_Strategy());
pakagestrategyC.PackeMyEpxress();
}
}
三、小结
个人认为,设计模式是一种处理问题的思维方式。更注重的是理解其中变量处理的巧妙之处。不需要太刻意的记住他们的附带属性,比如它是否属于行为模式,还是遵循了什么开闭原则这些。都不是我们的学习重点。去繁化简,灵活运用而不注重形式才是学习之道。