什么是策略模式

首先策略模式属于GOF23中设计模式中的一种,是一种行为型的设计模式。“行为”主要是指不同的方法或者算法。

其实就是我们定义和封装一些策略(或者说是算法),这些策略是可以相互替换的。然后客户端类通过使用这些不同的策略就可以表现出不同的行为。

相信大家一定见到过if-else 满天飞的代码,其实可以考虑使用策略模型进行优化。

策略模式代码示例

这里我们以上班需要选择不同的交通工具为例,说明策略模式的实现。

1、首先建立一个接口,这个接口是所有策略类都要实现的,这样才能保证是可以相互替换的。即创建一个TrafficWayStrategy接口:

public interface TrafficWayStrategy {void toWorkBy();
}

2、然后创建三种不同的实现方式,也就是不同的策略:

public class BikeStrategy implements TrafficWayStrategy{public void toWorkBy() {System.out.println("骑自行车去上班");}
}public class BusStrategy implements TrafficWayStrategy{public void toWorkBy() {System.out.println("坐公交去上班");}
}public class DidiStrategy implements TrafficWayStrategy{public void toWorkBy() {System.out.println("打滴滴去上班");}
}

3、创建策略模式context类,使用策略实现行为。在该类中持有策略对象的引用,注意是接口类型的引用,这样才能使用多态特性实现策略的切换:

public class WorkTo {private TrafficWayStrategy strategy;public WorkTo(TrafficWayStrategy strategy) {this.strategy = strategy;}// 改变策略的方法public void chageStrategy(TrafficWayStrategy strategy){this.strategy = strategy;}public void toWork(){System.out.println("小明同学");strategy.toWorkBy();}
}

至此,策略模式的代码已经完毕。新建测试类或客户端调用陈旭,验证:

public class StratetyMain {public static void main(String[] args) {TrafficWayStrategy strategy = new BikeStrategy();WorkTo workTo = new WorkTo(strategy);workTo.toWork();// 小明不想骑自行车上班了,要打滴滴workTo.chageStrategy(new DidiStrategy());workTo.toWork();}
}

看下运行结果:

小明同学
骑自行车去上班
小明同学
打滴滴去上班

策略模式使用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

策略模式在源码中应用

1、集合工具类Collections中的sort方法,其中有一个参数是Comparator类型的对象。这里Comparator接口就是抽象策略,我们可以自己实现其中的compare()方法,代表不同的实现策略。

    public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}

2、我们之前讨论过线程池的7个核心参数(不了解的可以看下这篇Java并发编程一万字总结(吐血整理)-续篇),其中最后一个参数就是拒绝策略RejectedExecutionHandler。在线程池使用静态内部类的方式实现了四种策略:

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

这里使用的就是典型的策略模式的一种实现了。

3、再有我们IO流中的File文件类,其中有一个list()方法,用于列出所有文件名,该方法可以传入一个FilenameFilter类型的参数,FilenameFilter是一个接口。我们可以自己实现过滤策略。

    public String[] list(FilenameFilter filter) {String names[] = list();if ((names == null) || (filter == null)) {return names;}List<String> v = new ArrayList<>();for (int i = 0 ; i < names.length ; i++) {if (filter.accept(this, names[i])) {v.add(names[i]);}}return v.toArray(new String[v.size()]);}

FilenameFilter 是个接口,可以理解我抽象策略接口

public interface FilenameFilter {boolean accept(File dir, String name);
}

设计模式系列文章回顾

Java面试必备:手写单例模式

工厂模式超详解(代码示例)

设计模式之原型模式

设计模式之代理模式

设计模式之委派模式,大名鼎鼎的Spring都在用

我要打十个!详解建造者模式(builder pattern)

还在if-else行走天下?试试【策略模式】吧相关推荐

  1. 还在用 if else?试试策略模式吧!

    作者 | LA 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 我们使用的App大多都有分享的功能,我们可以选择分享到不同的地方,比如微博.微信.QQ等等,虽然是同一个内容,但是分 ...

  2. 还在使用if else写代码?试试 “策略模式” 吧!

    我们使用的app大多都有分享的功能,我们可以选择分享到不同的地方,比如微博.微信.QQ等等,虽然是同一个内容,但是分享到不同的平台就会有不同的处理方式,比如要跳转到不同的app或者直接复制链接等等.如 ...

  3. 别在再满屏的 if、else 了,试试策略模式,真香!!

    你还在写满屏的 if/ else/ switch 之类的判断逻辑吗? 栈长在开发人员的代码中看过太多这样的低级代码了,真的太 low,极不好维护,本文栈长就教你如何用策略模式干掉 if/ else/ ...

  4. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  5. c++switch实现猜拳_策略模式+简单工厂+注解消除 if-else/switch-case

    消除代码中的 if-else/switch-case 在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的 ...

  6. 设计模式(一)————策略模式(张三的故事??)

    引言 当我们完成一个复杂的业务中常常会面临一个问题:针对一个对象的某个行为,不同的情境下有不同的处理方式: 就比如今天我要去上班,那么我需要以哪种交通方式去上班呢?可以有下面几种选择: 步行 公交 地 ...

  7. 设计模式- 策略模式

    在开始说设计模式之前,让我们先聊点别的东西,相信每个人都有自己难忘的童年时光,在那时有很多有趣好玩的事物陪伴着我们.我记得小时候,很喜欢看一部动画片--<四驱兄弟>,,,好吧暴露年纪了.. ...

  8. 游戏设计模式之策略模式(二)

    今天来讲一下策略模式. 在我们进行游戏开发的时候,总避免不了改动自己的算法.特别是你做完一个功能之后,策划跑来跟你说,我觉得我们还可以加一个功能(这个功能跟前一个功能类似),第一次过来跟你说要加,那自 ...

  9. 设计模式-策略模式(Go语言描述)

    好久没有更新博客了,最近也是在忙着充电,今天这篇博客开始,我们来了解一下设计模式. 设计模式 那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧. 设计模式/软件设计模式(Design pa ...

最新文章

  1. pandas 删掉空行
  2. React中使用setState
  3. 设置mysql最大连接数的方法
  4. Cisco网络防火墙配置方法
  5. iphone短信尚未送达_第五期:从苹果 乔布斯 iPhone 说到张小龙 微信 理财通
  6. python读取配置文件获取所有键值对_python读取配置文件
  7. 开启事物_开启大门,聚焦在正确的事物上
  8. ROS笔记(29) 启动Movelt!
  9. 80端口被占用时的终极解决方法
  10. ssh (安全外壳协议)
  11. 三步教会你在solidworks中画铝型材
  12. 前端人员必看css命名,前端css命名规范
  13. Matlab中 regionprops和bwlabel的用法
  14. 【应用笔记】【AN002】通过iTool2基于MinGW平台读写EEPROM
  15. 大学四年,因为这40个开发工具,我成为别人眼中的大神
  16. Photoshop CS6 实例之用快速选择工具扣取美女
  17. There is no getter for property named ‘distinct‘ in ‘class tk.mybatis.mapper
  18. 计算机网络ppp,计算机网络 第7章 PPP和Internet接入.ppt
  19. SQL数据库经典题型(1)查询“001“课程比“002“课程成绩高的所有学生的学号
  20. 首汽约车驶向极速统一之路!出行平台如何基于StarRocks构建实时数仓?

热门文章

  1. 华附计算机学神,【学习】时隔13年,华附两牛娃杀进奥数国家队,父母亲述学霸成长史!...
  2. 机器学习——决策树算法的应用
  3. getchar和putchar函数详解
  4. 手撸架构,Redis面试41问
  5. 如何引爆手淘首页流量,手淘首页流量获取玩法
  6. spring事务5个隔离界别和7钟传播行为
  7. F. chino with ball
  8. GEMU 107-263 8A 250V
  9. 《Spring中的自动装配》
  10. Detailed OCI error val is 12154 and errmsg is ‘ORA-12154: TNS:could not resolve the connect identifi