策略模式详解(定义角色及应用实例)

策略模式详解(定义角色及应用实例)-mikechen

策略模式是属于设计模式中的行为模式中的一种,策略模式主要解决选项过多的问题,避免大量的if else 和 switch下有太多的case。

策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性@mikechen

策略模式的定义

策略(Strategy)模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

策略是个形象的表述,所谓策略就是方案,日常生活中,要实现目标,有很多方案,每一个方案都被称之为一个策略

打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。

再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。

在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径,这就是策略模式。

策略模式的结构

策略模式详解(定义角色及应用实例)-mikechen
这个模式涉及到三个角色:

1.环境(Context)角色

持有一个策略类的引用,提供给客户端使用。

2.抽象策略(Strategy)角色

这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。

3.具体策略(ConcreteStrategy)角色

实现了抽象策略定义的接口,包装了具体的算法或行为。

策略模式的实现

策略模式详解(定义角色及应用实例)-mikechen

1.创建抽象策略类

package com.mikechen.java.design.strategy;




/**
* 抽象策略类
*
* @author mikechen
*/
public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}

2.创建具体策略

1)具体策略A

package com.mikechen.java.design.strategy;




/**
* 具体策略A
*
* @author mikechen
*/
public class ConcreteStrategyA  implements Strategy {
    @Override
    public void strategyInterface() {
        System.out.println("执行策略A");
    }
}

2)具体策略B

package com.mikechen.java.design.strategy;




/**
* 具体策略B
*
* @author mikechen
*/
public class ConcreteStrategyB implements Strategy {
    @Override
    public void strategyInterface() {
        System.out.println("执行策略B");
    }
}

 

3.创建环境类

package com.mikechen.java.design.strategy;




/**
* 环境类
*
* @author mikechen
*/
public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;




    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    
    /**
     * 策略方法
     */
    public void contextInterface(){




        strategy.strategyInterface();
    }
}

 

策略模式的优缺

策略模式详解(定义角色及应用实例)-mikechen

1.优点

  • 算法可以自由切换
  • 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
  • 扩展性良好,增加一个策略只需实现接口即可

2.缺点

  • 策略类数量会增多,每个策略都是一个类,复用的可能性很小
  • 所有的策略类都需要对外暴露

 

策略模式的应用场景

策略模式详解(定义角色及应用实例)-mikechen

  • 多个类只有算法或行为上稍有不同的场景
  • 算法需要自由切换的场景
  • 需要屏蔽算法规则的场景
  • 出行方式,自行车、汽车等,每一种出行方式都是一个策略
  • 商场促销方式,打折、满减等

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法