设计模式速记-策略模式
一、策略模式简介
1. 什么是策略模式
策略模式是一种对象行为型模式,策略模式定义:
策略模式针对于一组算法,旨在将这组算法的使用和实现分开。针对一系列具有共同目的的算法,用不同的类将每个算法封装起来,使用算法时通过策略类来进行选择。
所以,策略模式简而言之,就是将算法的实现与使用分割开来;使用时必须理解各个算法类的特点特性,通过统一的执行类来使用。
2. 策略模式的优缺点
策略模式的主要优点如下:
- 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
- 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
- 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
- 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
- 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
策略模式的缺点如下:
- 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
- 策略模式造成很多的策略类。
3. 策略模式举例
生活中可以见到很多涉及到策略模式的例子,如:
- 选择出行方式;飞机、轮船、火车、汽车等都是一种策略。
- 选择排序算法;针对不同的情况有不同的算法,冒泡、快排、希尔、堆排序等都各为一种策略;
二、策略模式示例
1. 策略模式涉及的角色
- 抽象策略接口:定义一个公共接口,让不同的算法类实现此接口;
- 具体抽象类:实现了抽象策略接口的类,提供算法的具体实现;
- 环境类:持有一个策略类的引用,最终交给使用方调用。
2.示例代码
示例代码为使用策略模式来选择出行方式:
- 抽象策略接口
/** * @Description 抽象策略接口 */ public interface TravelMethod { void travel(); }
- 具体抽象类
/** * @Description 轮船出行策略类 */ public class ShipTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by ship"); } } /** * @Description 飞机出行策略类 */ public class FlightTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by airplane"); } } /** * @Description 汽车出行策略类 */ public class BusTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by bus"); } }
- 环境类(负责具体策略执行)
/** * @Description 环境类,有权限执行策略 */ public class Context { private TravelMethod travelMethod; public Context(TravelMethod travelMethod){ this.travelMethod = travelMethod; } /** * 设置策略(出行方式) * @param travelMethod 出行方式策略类 */ public void setTravelMethod(TravelMethod travelMethod) { this.travelMethod = travelMethod; } /** * 执行策略 */ public void travel(){ this.travelMethod.travel(); } }
- 测试类客户端
/** * @Description 策略模式测试 */ public class StrategyTest { @Test public void travelTest(){ TravelMethod busTravelMethod = new BusTravelMethod(); TravelMethod flightTravelMethod = new FlightTravelMethod(); TravelMethod shipTravelMethod = new ShipTravelMethod(); Context context = new Context(busTravelMethod); context.travel(); context.setTravelMethod(flightTravelMethod); context.travel(); context.setTravelMethod(shipTravelMethod); context.travel(); } }
- 测试结果
travel by bus
travel by airplane
travel by ship
三、参考文献
- 菜鸟教程-策略模式
- C语言中文网-策略模式
- 百度百科-策略模式