posts - 13,  comments - 58,  trackbacks - 1

类关系图

角色说明
· 环境(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 秘笈实施()
        
{
            秘笈.秘笈实施();
        }

    }

}

策略模式
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

 

posted on 2006-12-09 15:47 十分之七 阅读(437) 评论(7)  编辑 收藏