zoukankan      html  css  js  c++  java
  • 策略模式

    1.什么是策略模式

    策略模式属于对象行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。

    2.策略模式的结构

    策略模式是对算法的包装,把使用算法的责任和算法本身分开,委派给不同的对象管理。


    环境(Context)角色:持有一个Strategy引用;

    抽象角色(Strategy)对象:抽象角色,由一个抽象类或借口实现,它指出所有的具体策略类所需的接口;

    具体角色(ConcreteStrategy)对象:包装了相关算法或行为;

    public class Context{
        private Strategy strategy;
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
        public ContextInterface(){
            this.strategy.strategyInterface();
        }
    }
    public interface Strategy(){
        void strategyInterface();
    }
    public class ConcreteStrategyA implements Strategy{
        void strategyInterface(){
            System.out.println("this is strategyInterfaceA");
        }
    }


    策略模式仅仅封装算法,提供新的算法插入到已有系统以及老算法从系统中删除的方法,但策略模式不决定何时使用何种算法,在什么情况下使用何种算法是由客户端决定的。

    策略模式的重心不是算法如何实现,而是如何组织调用这些算法,从而让程序结构更灵活,具有更好的扩展性和维护性。策略模式使得各种算法在地位上是平等的,因此各个算法之间可以相互替换,策略算法是相同行为的不同实现。运行时,策略模式在一个时刻只能使用一个具体的策略实现对象。

    3.策略模式和工厂模式的区别

    工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化。
    我们去旅行。策略模式的做法:有几种方案供你选择旅行,选择火车好呢还是骑自行车,完全有客户自行决定去构建旅行方案(比如你自己需要去买火车票,或者机票)。而工厂模式是你决定哪种旅行方案后,不用关注这旅行方案怎么给你创建,也就是说你告诉我方案的名称就可以了,然后由工厂代替你去构建具体方案(工厂代替你去买火车票)。

    4.策略模式的优缺点

    优点:

    (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
    (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

    缺点:

    (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
    (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。


    参考资料:http://blog.csdn.net/hguisu/article/details/7558249

    http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html



  • 相关阅读:
    存储那些事儿(二): 下一代Linux文件系统BTRFS简介
    RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
    RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
    RabbitMQ消息队列(六):使用主题进行消息分发
    C++内存管理之shared_ptr
    C++程序调试方式总结
    匿名对象?临时对象?
    C++多态中虚函数表合并与继承问题
    C++继承体系中的内存分段
    C++继承体系中的内存对齐
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3144922.html
Copyright © 2011-2022 走看看