中秋灾难过后,厦门逐渐恢复生机,随着国庆脚步临近,不少旅行者开始考虑放假七天到厦门旅游。
那么今天我们就来谈谈到厦门的,旅游策略
教科书定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
简单举例,就是,有一项工作,这项工作是分为三个环节完成(三个环节相互独立,同等重要),但是这三个环节中的每一个环节都可以有多种实现方式。
我们要做的就是,让这项工作的完成方式,多种多样,随意替换
下面代码见:
今天的主角类型:
1、TravelStrategy类(主策略类)
2、三类抽象接口Ieat、Ilive、Ivehicle
3、Ieat、Ilive、Ivehicle的不同接口实现类
首先是: 三个抽象接口Ieat、Ilive、Ivehicle
//定义"吃"接口
public interface IeatBehavior {
public void eat();
}
//定义"住"接口
public interface IliveBehavior {
public void live();
}
//定义"出行"接口
public interface IvehicleBehavior {
public void vehicle();
}
其次是,TravelStrategy旅行策略类
//旅行策略,包含吃、住、出行
public class TravelStrategy {
public String name;
private IeatBehavior mEat;
private IliveBehavior mLive;
private IvehicleBehavior mVehicle;
//构造函数,传入旅行者姓名
public TravelStrategy(String traveler) {
this.name = traveler;
}
//传入实现接口的具体实例
public void setEatBehavior(IeatBehavior eatbehavior) {
this.mEat = eatbehavior;
// return this; // (若返回this本类,则可在Test中链式编程)
}
//传入实现接口的具体实例
public void setLiveBehavior(IliveBehavior livebehavior) {
this.mLive = livebehavior;
// return this; // (若返回this本类,则可在Test中链式编程)
}
//传入实现接口的具体实例
public void setVehicleBehavior(IvehicleBehavior vehiclebehavior) {
this.mVehicle = vehiclebehavior;
// return this; // (若返回this本类,则可在Test中链式编程)
}
// 执行实例传入的吃
public void eat() {
mEat.eat();
}
// 执行实例传入的住
public void live() {
mLive.live();
}
// 执行实例传入的出行
public void vehicle() {
mVehicle.vehicle();
}
}
最后,是实现了相应接口的具体实例类:
//具体的“吃”行为
public class EatGingerDuck implements IeatBehavior {
@Override
public void eat() {
System.out.println("吃姜母鸭");
}
}
//具体的“吃”行为
public class EatSeafood implements IeatBehavior {
@Override
public void eat() {
System.out.println("吃海鲜");
}
}
//具体的“住”行为
public class LiveIsland implements IliveBehavior {
@Override
public void live() {
System.out.println("住鼓浪屿");
}
}
//具体的“住”行为
public class LiveSeaside implements IliveBehavior {
@Override
public void live() {
System.out.println("住环岛路");
}
}
//具体的“出行”行为
public class VehicleBus implements IvehicleBehavior {
@Override
public void vehicle() {
System.out.println("乘观光巴士出行");
}
}
//具体的“出行”行为
public class VehicleShip implements IvehicleBehavior {
@Override
public void vehicle() {
System.out.println("乘轮渡游艇出行");
}
}
大功告成,写个测试类Test试试
public class Test {
public static void main(String[] args) {
// 创建 旅行者策略实例,如需改变吃、住、出行,只需改变不同的接口便可
TravelStrategy traveler = new TravelStrategy("郑成功");
traveler.setEatBehavior(new EatSeafood());
traveler.setLiveBehavior(new LiveIsland());
traveler.setVehicleBehavior(new VehicleShip());
// 测试执行
System.out.println(traveler.name);
traveler.eat();
traveler.live();
traveler.vehicle();
}
}
控制台输出结果
郑成功
吃海鲜
住鼓浪屿
乘轮渡游艇出行
如果我们想让郑爷换一种方式游厦门
只需要改动Test中传入的接口,比如
public class Test {
public static void main(String[] args) {
// 创建 旅行者策略实例,如需改变吃、住、出行,只需改变不同的接口便可
TravelStrategy traveler = new TravelStrategy("郑成功");
// traveler.setEatBehavior(new EatSeafood());
// traveler.setLiveBehavior(new LiveIsland());
// traveler.setVehicleBehavior(new VehicleShip());
traveler.setEatBehavior(new EatGingerDuck());
traveler.setLiveBehavior(new LiveSeaside());
traveler.setVehicleBehavior(new VehicleBus());
// 测试执行
System.out.println(traveler.name);
traveler.eat();
traveler.live();
traveler.vehicle();
}
}
控制台输出就变为:
郑成功
吃姜母鸭
住环岛路
乘观光巴士出行
好了,到此为止,想让郑爷吃好料,住豪宅,小伙伴们就自己敲敲代码试一试吧
献上源码: