Java设计模式之策略模式
Java策略模式
前言
今天在学习时遇到了Comparator,发现之前记忆的有些模糊了,便重新温习,发现了Comparator便使用了策略模式,所以又简单学习了策略模式,用本篇来简单记录。
一、策略模式是什么?
策论模式(StrategyPattern),简单地说就是对象动态切换不同“策略”,使对象有不同的行为。策略模式封装了变化。策略模式又叫算法簇模式。它定义了一系列的算法用来完成相同的工作。策略模式让算法独立于使用它的客户而独立变化。 ----大话设计模式
二、策略模式的简单实现
举个例子(用这个例子来分析上面的那句话): 打工人去工作,有很多出行方式,这些方式就是多种策略,这些方式都是为了去工作。
-
由于有多种不同方式去工作,从Java面向对象思想出发,要封装变化,即定义一个接口
//去工作的方式接口 interface GoToWork { void way(); }
-
接下来就是具体方式
//方式一,坐公交去 class ByBus implements GoToWork { @Override public void way() { System.out.println("坐公交去工作"); } } //方式二,飞过去 class Fly implements GoToWork{ @Override public void way() { System.out.println("起飞去工作"); } } //方式三,走路过去 class Walk implements GoToWork{ @Override public void way() { System.out.println("走路去工作"); } }
-
最后就是让方式独立于他的客户独立变化
class Worker{ private GoToWork goToWork; public Worker(GoToWork goToWork){ this.goToWork=goToWork; } public void setStrategy(GoToWork goToWork){ this.goToWork = goToWork; } public void go(){ goToWork.way(); } }
策略模式有一个Context上下文对象,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。这里的上下文对象就是Worker
为什么要有它?或者说为什么我们不直接使用new Fly().way()来实现对策略的直接调用?
如果没有上下文的话,客户端就必须直接和具体的策略实现进行交互了,尤其是需要提供一些公共功能或者是存储一些状态的时候,会大大增加客户端使用的难度;引入上下文之后,这部分工作可以由上下文来完成,客户端只需要和上下文进行交互就可以了。这样可以让策略模式更具有整体性,客户端也更加的简单。通过Worker来调用更符合面向对象的思想
-
测试代码:
public class Test { public static void main(String[] args) { //选择走 System.out.println("-----第一天-----"); Worker worker = new Worker(new Walk()); worker.go(); //选择坐公交 System.out.println("-----第二天-----"); worker.setStrategy(new ByBus()); worker.go(); //选择起飞 System.out.println("-----第三天-----"); worker.setStrategy(new Fly()); worker.go(); } }
-
结果:
-----第一天----- 走路去工作 -----第二天----- 坐公交去工作 -----第三天----- 起飞去工作
-
简单类图:
在实践中,只要听到需要在不同情况下应用不同的业务或出现很多if else,就可以考虑使用策略模式来封装这种变化的可能性。
三、策略模式的优缺点
优点:
- 能动态改变对象的行为,方便扩展策略
缺点:
- 一个策略一个类,可能类会过多
- 上层模块(客户端)必须知道有哪些策略,然后才能决定使用哪个策略