(十五)策略模式

一、概念

定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

简化if-else操作,方便扩展

本质:少用继承,多用组合

二、编写步骤

  • 1、定义抽象策略接口
  • 2、编写具体的策略实现类
  • 3、定义环境角色,持有策略引用

三、案例

实现一个加减乘除法的功能

(1)定义策略接口

public interface IStrategy {

    int calculate(int num1,int num2);

}

(2)定义策略实现类

public class AddStrategy implements IStrategy {
    public int calculate(int num1, int num2) {
        return num1 + num2;
    }
}

public class SubtractStrategy implements IStrategy {
    public int calculate(int num1, int num2) {
        return num1 - num2;
    }
}

(3)定义环境角色

public class Environmenet {

    private IStrategy strategy;

    public Environmenet(IStrategy strategy) {
        this.strategy = strategy;
    }

    public int calculate(int num1, int num2) {
        return strategy.calculate(num1, num2);
    }
}

(4)测试调用

public static void main(String[] args) {
    // 传入具体的策略
    Environmenet environmenet = new Environmenet(new AddStrategy());
    environmenet.calculate(1,2);
}

四、类图

在这里插入图片描述

五、应用场景

  • 1、Comparator比较器

在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式。
在该比较架构中,Comparator就是一个抽象的策略;一个类实现该结构,并实现里面的compare方法,该类成为具体策略类;Collections类就是环境角色,他将集合的比较封装成静态方法对外提供api。

  • 2、ThreadPoolExecutor中的四种拒绝策略

在创建线程池时,需要传入拒绝策略,当创建新线程使当前运行的线程数超过maximumPoolSize时,将会使用传入的拒绝策略进行处理

AbortPolicy:直接抛出异常。 
CallerRunsPolicy:只用调用者所在线程来运行任务。 
DiscardOldestPolicy:丢弃队列里最近的一个任务(队列头部),并执行当前任务。 
DiscardPolicy:不处理,丢弃掉。 
  • 3、Spring中的XmlBeanDefinitionReader

  • 4、Spring中的ResourceLoader

发布了18 篇原创文章 · 获赞 0 · 访问量 280
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览