java常用设计模式(二)策略模式
设计模式第二篇,策略模式,请大家多多指教。
简介
策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用该算法的客户(引自《Head First设计模式》)。举个栗子,我们可以用旅行这一行为来代入该模式,我们旅行的交通工具可以选择汽车、火车、飞机、轮船等等,这些可供选择的交通工具可以理解为算法族,他们之间是可以相互替换的,我们通过使用不同的交通工具来达到我们相同的一个目标,这就是策略模式。说了这些理论知识,让我们通过代码来具体实现该模式。
策略模式的例子
第一步:定义一个旅行接口TravelBehavior,有一个选择交通工具这一方法。
public interface TravelBehavior { /** 选择交通工具 */ void chooseVehicle(); }
第二步:定义n个可供选择的出行方式类,实现TravelBehavior接口
public class AirplaneBehavior implements TravelBehavior{ /** * 选择交通工具 */ @Override public void chooseVehicle() { System.out.println("我选择飞机"); } } public class BusBehavior implements TravelBehavior{ /** * 选择交通工具 */ @Override public void chooseVehicle() { System.out.println("我选择大巴"); } } public class SteamshipBehavior implements TravelBehavior{ /** * 选择交通工具 */ @Override public void chooseVehicle() { System.out.println("我选择轮船"); } } public class TrainBehavior implements TravelBehavior{ /** * 选择交通工具 */ @Override public void chooseVehicle() { System.out.println("我选择火车"); } } public class WalkBehavior implements TravelBehavior{ /** * 选择交通工具 */ @Override public void chooseVehicle() { System.out.println("我选择走路"); } }
第三步:定义一个人的类Person,有一个成员变量是旅行的行为
public class Person { private TravelBehavior travelBehavior; public Person(TravelBehavior travelBehavior) { this.travelBehavior = travelBehavior; } public void go(){ travelBehavior.chooseVehicle(); System.out.println("出发"); } }
第四步:开始测试
public class TravelTest { private static Map<String,Object> behaviorMap = new HashMap<>(); static { behaviorMap.put("airPlain",new AirplaneBehavior()); behaviorMap.put("bus",new BusBehavior()); behaviorMap.put("ship",new SteamshipBehavior()); behaviorMap.put("train",new TrainBehavior()); behaviorMap.put("walk",new WalkBehavior()); } public static void go(String way){ if(StringUtils.isEmpty(way)){ way = "walk"; } Person person = new Person((TravelBehavior) behaviorMap.get(way)); person.go(); } public static void main(String[] args) { //此处模拟前台传递给后台的参数:出行方式 String way = ""; go(way); } }
总结
上面写了一个最简单的策略模式(我估计没有比这个更简单的了),我们来总结一下,首先人出行的方式我们抽象出来了,同理我们能够抽象出人吃饭、穿衣、工作等等一系列的行为,我们为每种行为都能定义出具体的实现。按照《head first设计模式》一书中提到的设计模式要素:算法族(旅行方式)、分别封装(各种行为的具体实现)、相互替换(做到了)。当然,写到这里这个例子的问题还有很多,比如说旅行其实不能通过单纯的行为替换来实现,应该算是一种组合行为的替换,又比如说,人应该是一种抽象,不是所有的“人”都能出行(假人就不行)等等。缺点很多,但是上面的例子应该把策略模式的思想体现出来了,望大家都能够领悟这种思想,并在实际开发中多多应用。