首页 > 代码库 > 设计模式------策略模式

设计模式------策略模式

   策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。何谓算法呢?它是一种描述程序行为的语言,广泛应用于计算机科学领域,是一种让程序最为简洁的思考方式。

一、组成:

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

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

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

二、应用场景:

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

三、优缺点:

优点:

1、提供了管理相关的算法族的办法。

2、提供了可以替换继承关系的办法。

3、可以避免使用多重条件转移语句。

缺点:

1、策略模式只适用于客户端知道所有的算法或行为的情况。

2、策略模式造成很多的策略类,每个具体策略类都会产生一个新类,可以使用享元模式来减少对象的数量。

四、策略模式vs简单工厂模式:

      简单工厂模式是创建型模式,关注对象的创建。策略模式是行为型模式,关注行为的封装。简单工厂模式是根据不同的条件返回一个适合的类给你使用,然后调用者使用工厂类返回的类去完成相应的操作。而策略模式是首先创建一个想使用的类实例,然后实例被当作参数传递进去,既而通过该实例去调用不用的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。

五、代码示范:

1.抽象策略类:

//抽象算法类
    abstract class Strategy
    {
        //算法方法
        public abstract void AlgorithmInterface();
    }
2.具体策略角色:

 //具体算法A
    class ConcreteStrategyA : Strategy
    {
        //算法A实现方法
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法A实现");
        }
    }
    //具体算法B
    class ConcreteStrategyB : Strategy
    {
        //算法B实现方法
        ...
    }
    //具体算法C
    class ConcreteStrategyC : Strategy
    {
        //算法C实现方法
        ...
    }
3.环境角色:

 //上下文
    class Context
    {
        Strategy strategy;

        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        //上下文接口
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }
4.客户端:

 static void Main(string[] args)
        {
            Context context;

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

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

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

            Console.Read();
        }
5.运行结果:



       策略模式是一种定义一系列算法的方法,这些算法完成的都是相同的工作。比如说超市搞活动,具有多种收银方式,可以打折,满200返50,满100积1分等等,它们只是实现不同。策略模式封装了算法,它们以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。这样收银员不必搞清楚具体的收费方式是如何计算的,只需机械的简单操作,从而减少了误差,提高了效率。策略模式还可以简化单元测试,优化系统结构。但如果超市要增加新的算法,就需要更改底层的代码,如何避免呢?这就要用到我们以后要学的反射技术了,期待ing,办法总是比困难多的。