什么是策略模式
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
策略模式的简单实现
业务场景
小明同学想去一次旅行,他可以选择坐火车、轮船、开车的三中方式出行,我们就通过这个场景需求来实现策略模式
UML
由uml图中我们可以看出小明同学想要去旅行(travel(Traddic)),他需要选择一种出行方式Traffic,我们的出行方式提供了Car、Train、Plain(这三种方式是被配置到枚举中),小明可以通过枚举进行选择需要哪种出行方式。若干天后系统升级多了一种出行方式步行(walk),这时候只需要新增一种出行方式,并在枚举中维护这种出行方式就行了。小明第二次去旅行还是以同样的方式来选择,没有改变小明的操作流程,只是在小明选择的时候会发现只是多了一种出行的方式。这样的好处是我们的业务扩展并没有修改原来的业务代码逻辑,符合了开闭原则。
升级后的UML
代码实现
package com.swh.design.strategy;
public interface Person {
void travel(Traffic traffic);
}
package com.swh.design.strategy;
public class XiaoMing implements Person{
@Override
public void travel(Traffic traffic) {
System.out.println("计划,收拾东西,准备出发");
traffic.traffic();
System.out.println("到达目的地,开始游玩");
}
}
交通类型
package com.swh.design.strategy;
public interface Traffic {
void traffic();
}
package com.swh.design.strategy;
public class Car implements Traffic{
@Override
public void traffic() {
System.out.println("使用汽车去旅游");
}
}
package com.swh.design.strategy;
public class Plain implements Traffic{
@Override
public void traffic() {
System.out.println("使用飞机去旅游");
}
}
package com.swh.design.strategy;
public class Train implements Traffic{
@Override
public void traffic() {
System.out.println("使用火车去旅行");
}
}
package com.swh.design.strategy;
public class Walk implements Traffic{
@Override
public void traffic() {
System.out.println("通过步行来");
}
}
package com.swh.design.strategy;
public enum TrafficType {
CAR(new Car()),PLAIN(new Plain()),TRAIN(new Train()),WALK(new Walk());
Traffic traffic;
TrafficType(Traffic traffic) {
this.traffic = traffic;
}
}
测试类
package com.swh.design.strategy;
public class StrategyClient {
public static void main(String[] args) {
Person person = new XiaoMing();
person.travel(TrafficType.WALK.traffic);
}
}
运行结果: