码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式-Strategy

时间:2019-10-29 19:30:19      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:code   比较   nts   sig   也有   运行   mic   stp   div   

策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简单理解就是一组算法,可以互换,再简单点策略就是封装算法。

一、类图

技术图片

策略模式包含如下三个角色:
  • 环境(Context)角色:持有一个Strategy的引用。
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

二、示例

假设某人在开车时频繁加速,因为超速他被一个警察拦下来了。有可能这个警察会比较友好,没开任何罚单就让他把车开走了。也有可能遇到了一个不太友好的警察,然后这个警察给他出具了一张罚单。但是并不知道会遇到什么类型的警察,直到他因为超速而被警察拦下停车,实际上这就是一种程序当中“运行时”的概念,只有在运行的时候才知道,到底会遇到什么类型的警察,实际上这就是“策略模式”。

策略接口:

//先来定义一个策略的接口:Strategy
public interface Strategy {

    public void processSpeeding(int speed);

}

两种不同类型的Strategy:

public class NicePolice implements Strategy {

    @Override
    public void processSpeeding(int speed) {
        System.out.println("This is your first time, be sure don‘t do it again!");
    }

}

public class HardPolice implements Strategy {

        @Override
        public void processSpeeding(int speed) {
             System.out.println("Your speed is " + speed+ ", and should get a ticket!");
    }

}

定义需要依赖警察来处理超速问题的场景

public class Situation {

   private Strategy strategy;
    
   public Situation(Strategy strategy){
       this.strategy = strategy;
   }
    
   public void handleByPolice(int speed){
       this.strategy.processSpeeding(speed);
   }

}

测试

public class Main {

    public static void main(String[] args) {
        HardPolice hardpolice = new HardPolice();
        NicePolice nicepolice = new NicePolice();

        // In situation 1, a hard officer is met
        // In situation 2, a nice officer is met
        Situation s1 = new Situation(hardpolice);
        Situation s2 = new Situation(nidepolice);

        // the result based on the kind of police officer.
        s1.handleByPolice(10);
        s2.handleByPolice(10);

    }

}

三、策略模式优缺点

优点:

  • 算法可以自由切换:改一下策略很方便

  • 扩展性良好:增加一个策略,就多增加一个类就好了。

缺点:

  • 策略类的数量增多:每一个策略都是一个类,复用的可能性很小、类数量增多

  • 所有的策略类都需要对外暴露:上层模块必须知道有哪些策略,然后才能决定使用哪一个策略

四、JDK中的策略模式

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

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

这里使用的就是策略模式

 

策略模式-Strategy

标签:code   比较   nts   sig   也有   运行   mic   stp   div   

原文地址:https://www.cnblogs.com/rouqinglangzi/p/11760749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!