美文网首页
设计模式笔记五策略模式

设计模式笔记五策略模式

作者: summer_lz | 来源:发表于2017-03-16 09:41 被阅读11次

    每日一文

    欲闻其声反默,欲张反敛,欲高反下,欲取反与。欲开情者,象而比之,以牧其辞,同声相呼,实理同归。或因此,或因彼,或以事上,或以牧下,此听真伪、知同异,得其情诈也。动作言默,与此出入,喜怒由此以见其式,皆以先定为之法则。

    策略模式

    策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。在我理解
    如果我们想往一个方法当中插入随便一段代码的话,就是策略模式。即如下形式:

    public class MyClass {
        public void myMethod(StrategyInterface strategyInterface){
            System.out.println("方法里的代码");
            //你看我是不是插进来一段代码?而且这段代码是可以随便改变的
            strategyInterface.insertCode();
            System.out.println("方法里的代码");
        }
    }
    

    我们可以使用不同的策略接口实现类,实现统一方法下的不同策略动态加载!

    示例图


    实例

    1. 策略接口及实现:

    package net;
    
    public interface Strategy {
    
        void algorithm();
        
    }
    
    class ConcreteStrategyA implements Strategy{
    
        public void algorithm() {
            System.out.println("采用策略A计算");
        }
        
    }
    class ConcreteStrategyB implements Strategy{
    
        public void algorithm() {
            System.out.println("采用策略B计算");
        }
        
    }
    class ConcreteStrategyC implements Strategy{
    
        public void algorithm() {
            System.out.println("采用策略C计算");
        }
        
    }
    

    2. 插入策略的类

    package net;
    
    public class Context {
    
        Strategy strategy;
        
        public void method(){
            strategy.algorithm();
        }
    
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
    }
    

    3. 客户端调用

    package net;
    
    
    public class Client {
    
        public static void main(String[] args) throws Exception {
            Context context = new Context();
            context.setStrategy(new ConcreteStrategyA());
            context.method();
            
            context.setStrategy(new ConcreteStrategyB());
            context.method();
            
            context.setStrategy(new ConcreteStrategyC());
            context.method();
        }
    }
    

    总结:

    策略模式的重心
      策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
      算法的平等性
      策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
      所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现
      运行时策略的唯一性
      运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
      公有的行为
      经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。

    相关文章

      网友评论

          本文标题:设计模式笔记五策略模式

          本文链接:https://www.haomeiwen.com/subject/gwwrnttx.html