pursuedream
成功=水平+业务+沟通+判断
策略模式

是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的教材类图书实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣,而对非教材类的计算机图书有3%的折扣;对其余的图书没有折扣。由于有这样复杂的折扣算法,使得价格计算问题需要系统地解决。

使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于"可插入式(Pluggable)的算法"。

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。"

Strategy模式注重于算法的封装,而Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现

    //策略
    public abstract class Strategy
    {  //算法
        public abstract void AlgorithmInterface();
    }

    public class OneStartegy : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("Called OneStartegy");
        }
    }

    public class TwoStartegy : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("Called TwoStartegy");
        }
    }

    public class ThreeStartegy : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("Called ThreeStartegy");
        }
    }
    //封装策略
    public class Context
    {
        Strategy strategy;
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        public void ContextInface()
        {
            strategy.AlgorithmInterface();
        }
    }
实现
            Context c1=new Context(new OneStartegy());
            c1.ContextInface();

            Context c2=new Context(new TwoStartegy());
            c2.ContextInface();

            Context c3 = new Context(new ThreeStartegy());
            c3.ContextInface();
posted on 2007-06-25 15:21  pursuedream  阅读(275)  评论(0)    收藏  举报