2.策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

抽象策略角色:策略类,通常由一个接口或者抽象类实现。

具体策略角色:包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

示例

 

Stategy(抽象策略类)定义了一个公共接口,各种不同的算法以不同的方法实现这个接口,context使用这个接口调用不同的算法,一般使用接口或者抽象类实现。

    //抽象算法类
    public abstract class Starategy
    {
        //算法方法
        public abstract void AlgorithmInterface();
    }


具体策略类:实现Stategy定义的接口,提供具体的算法实现

    //具体算法A
    public class ConcreteStrategyA:Starategy
    {
        
        public override void AlgorithmInterface()
        {
            //do somthing
        }
    }


Context应用场景:

    //用一个算法类来配置,维护一个对Strategy对象的引用
    public class Context
    {
        Starategy star;
        //初始化,传入具体的策略对象
        public Context(Starategy star)
        {
            this.star = star;
        }

        //根据具体的策略对象,调用其算法的方法
        public void ContextInterface()
        {
            star.AlgorithmInterface();
        }

    }


客户端实现

            Context context = new Context(new ConcreteStrategyA());
            context.ContextInterface();

 

 策略模式与简单工厂模式

 public class Context
    {
        CashSuper cs = null;
        
        public Context(string type)
        {

            switch (type)
            {
                case "正常收费":
                    CashNormal cs0 = new CashNormal();
                    break;
                case "打八折":
                    CashRebate cs1 = new CashRebate("0.8");
                    break;
            }
        }

        
        public double CetResult(double money)
        {
            return cs.acceptCash(money);
        }

    }

客户端调用

CashContext csuper=new CashCont("0.8");

 

 策略模式是之中定义一些列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所用的算法,减少了各种算法类与使用算法类之间的耦合。

策略模式的Strategy类层次为Context定义了一系列的可供重用的算法和行为,继承有助于析取出这些算法中的公共功能。

优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

posted @ 2012-07-04 11:57  Xyang  阅读(192)  评论(0编辑  收藏  举报
hi