设计模式笔记五策略模式

每日一文

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

策略模式

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

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抽象类实现,而不能使用接口。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,261评论 9 62
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 4,094评论 1 15
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,230评论 2 16
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,243评论 25 708
  • 开完班会回来,刚到寝室门口听到室友在感慨自己现在和以前的变化,众人纷纷问其原因: A:怎么了,你这个老女人...
    旧亭旭阅读 253评论 0 1

友情链接更多精彩内容