设计模式 -- 策略模式

发布时间:2022-03-01 11:37:26 作者:yexindonglai@163.com 阅读(975)

    什么是策略模式?

         策略模式是有多个选择,每个选择都是一种策略,就像面向对象的一个特性:多态。就拿出行来说,比如我想从深圳去到北京,有多种出行方式供我选择 :飞机、高铁、汽车;每种选择方式都有自己的特点;

策略模式的原介绍是:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 ,在代码中更多的使用来表示算法的策略,比如我们GC 垃圾回收算法中就用到了策略模式

首先,算法是一个接口,所有的策略都是算法的实现类,实现不同的功能,这中间还有一个上下文 Context;Context是上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化,用类图来表示则是这样的

在上下文中一个属性为 算法的接口(也可以是抽象类),这个接口有多种实现,需要哪种实现则直接调用其实例对象即可,

 

策略模式的优点

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

缺点

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

使用场景

  • 多个类只有算法或行为上稍有不同的场景(这一点和模板方法模式类似)
  • 算法需要自由切换的场景

JDK哪里用到了策略模式

    JDK1.5之后新出了一个叫做并发包的东东,并发包里面就包含了线程池这个玩意,面试官经常问到的一个问题:“线程池一共有几个参数?”,答案是一共有7个参数,其中,最后一个参数就是拒绝策略,指的是线程池满了之后,如果再来一个线程要以怎样的方式来处理这个些线程,这个拒绝策略用的就是策略模式;

 

代码实现

  1. package com.designPatterm.strategy;
  2. /**
  3. * 设计模式-- 策略模式
  4. */
  5. public class StrategyTest {
  6. public static void main(String[] args) {
  7. //引用计数算法
  8. ContextGc a = new ContextGc(new GcA());
  9. a.show();
  10. // 标记压缩算法
  11. ContextGc b = new ContextGc(new GcB());
  12. b.show();
  13. //标记清除算法
  14. ContextGc c = new ContextGc(new GcC());
  15. c.show();
  16. }
  17. }
  18. // 垃圾回收机制算法接口
  19. interface GcStrategy{
  20. //算法方法
  21. void algorithm();
  22. }
  23. //引用计数算法
  24. class GcA implements GcStrategy{
  25. @Override
  26. public void algorithm() {
  27. System.out.println("引用计数算法");
  28. }
  29. }
  30. //标记压缩算法
  31. class GcB implements GcStrategy{
  32. @Override
  33. public void algorithm() {
  34. System.out.println("标记压缩算法");
  35. }
  36. }
  37. // 标记清除算法
  38. class GcC implements GcStrategy{
  39. @Override
  40. public void algorithm() {
  41. System.out.println("标记清除算法");
  42. }
  43. }
  44. //上下文,承上启下的作用
  45. class ContextGc{
  46. private GcStrategy strategy;
  47. public ContextGc( GcStrategy strategy){
  48. this.strategy = strategy;
  49. }
  50. // 使用算法
  51. public void show(){
  52. strategy.algorithm();
  53. }
  54. }

 

 

关键字设计模式