类关系图
角色说明
· 环境(Context)角色:持有一个Strategy类的引用。
· 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
· 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
意图
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性
许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
泡妞的例子
STRATEGY —跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。
泡妞的代码
using System;
using System.Collections;
namespace Strategy
{
public class 客户端
{
public static void Main()
{
追女秘笈 秘笈;
环境 实际环境=new 环境();
//策略模式把行为和环境分开
Console.WriteLine("早上了!");
秘笈=new 去海边();
实际环境.选秘笈(秘笈);
实际环境.秘笈实施();
Console.WriteLine("中午了!");
秘笈=new 吃小吃();
实际环境.选秘笈(秘笈);
实际环境.秘笈实施();
Console.WriteLine("晚上了!");
秘笈=new 看电影();
实际环境.选秘笈(秘笈);
实际环境.秘笈实施();
RL();
}
Helper methods
}
public abstract class 追女秘笈
{
abstract public void 秘笈实施();
}
//各种算法在具体的策略类中提供
public class 看电影:追女秘笈
{
public override void 秘笈实施()
{
Console.WriteLine("看泰坦尼克吧!");
}
}
//各种算法在具体的策略类中提供
public class 吃小吃:追女秘笈
{
public override void 秘笈实施()
{
Console.WriteLine("吃火锅!");
}
}
//各种算法在具体的策略类中提供
public class 去海边:追女秘笈
{
public override void 秘笈实施()
{
Console.WriteLine("沙滩漫步!");
}
}
//算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端
public class 环境
{
private 追女秘笈 秘笈;
//环境类负责维持和查询行为类
public void 选秘笈(追女秘笈 合适的秘笈)
{
秘笈=合适的秘笈;
}
public void 秘笈实施()
{
秘笈.秘笈实施();
}
}
}策略模式
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。


浙公网安备 33010602011771号