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