- 定义:
- 结构图:
- 事例代码:
『策略模式』定义了算法家族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化, 不会影响到使用算法的客户。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
将算法封装,使系统可以更换或扩展方法。策略模式的关键是所有子类的目标一致,但实现的方法不同。“殊路同归”可以说是策略模式的最好解释。
使用场合:
(1):有多种算法
(2):多个相似的类仅仅因为行为不同,这时可以将这些类合并并采用策略模式处理这些行为。
(3):一个类中的某个行为中有过多的分支,这时可以将这些行为封装为不同的算法。
(4):希望隐藏算法中采用的一些具体实例。
具体实例:
(1):采用不同的算法压缩数据。
(2):采用不同的方式对同样的数据绘图,如正方形、圆形、矩形。
(3):以不同格式保存数据,如将对象序列化为XML或者二进制格式并保存。
namespace Strategy_DesignPattern
{
using System;
//先定义一个策略抽象基类
abstract class Strategy
{
abstract public void DoAlgorithm();
}
//===============================================================================
//各子类继承此基类,并重写基类抽象方法
class FirstStrategy : Strategy
{
override public void DoAlgorithm()
{
Console.WriteLine("In first strategy");
}
}
class SecondStrategy : Strategy
{
override public void DoAlgorithm()
{
Console.WriteLine("In second strategy");
}
}
//===============================================================================
//=================================== 上下文类(客户类) =====================================
class Context
{
Strategy s; //声明策略基类类型变量
public Context(Strategy strat)
{
s = strat;
}
public void DoWork()
{
// some of the context's own code goes here
}
public void DoStrategyWork()
{
// now we can hand off to the strategy to do some
// more work
s.DoAlgorithm();
}
}
//==================================================================================
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
FirstStrategy firstStrategy = new FirstStrategy();
Context c = new Context(firstStrategy);
c.DoWork();
c.DoStrategyWork();
return 0;
}
}
}
策略上下文接口
定义需要支持的算法接口,由策略上下文接口调用。
注意:我这里所说的接口,并不一定就是接口类,实现上在这里是抽象类。
包含算法的具体实现。