策略模式
说明
策略模式(Strategy Pattern)属于行为型模式,也叫做政策模式(Policy Pattern),它是将定义的算法家族分配封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。
将达到某个目标的不同方式进行抽象封装,最终由客户端根据需求决定调用哪一种方法。
比如说一个人要到达深圳,到达深圳方式由很多种:飞机、高铁、火车、汽车、步行……我们将这几种方式进行封装,最后由用户根据自己需求决定调用(结合委派模式)哪一种方式。
结构
策略模式主要角色如下:
抽象策略角色(Strategy):定义了不同算法需要达到的目标;
具体策略角色(ConcreteStrategy):根据需求实现具体的算法;
上下文角色(Context):用来操作策略的类,将客户端与具体算法进行解耦,客户端直接访问该角色即可。
代码案例
抽象策略角色(Strategy)
/**
* @program: strategy
* @description: 出行方式接口
* 抽象策略角色(Strategy)
* @author: wxw
* @create: 2024-03-09 14:53
**/
public interface ITripMode {
/**
* 出发
* @param destination
*/
void depart(String destination);
}
具体策略角色(ConcreteStrategy)
/**
* @program: strategy
* @description: 高铁
* 具体策略角色(ConcreteStrategy)
* @author: wxw
* @create: 2024-03-09 14:55
**/
public class HighSpeedTrain implements ITripMode {
@Override
public void depart(String destination) {
System.out.println("===================");
System.out.println("您选择乘坐高铁前往:" + destination);
System.out.println("购买高铁票");
System.out.println("候车检票");
System.out.println("乘坐高铁中...");
System.out.println("到达目的地:" + destination);
System.out.println("===================");
}
}
/**
* @program: strategy
* @description: 飞机
* 具体策略角色(ConcreteStrategy)
* @author: wxw
* @create: 2024-03-09 14:55
**/
public class Plane implements ITripMode {
@Override
public void depart(String destination) {
System.out.println("===================");
System.out.println("您选择乘坐飞机前往:" + destination);
System.out.println("购买飞机票");
System.out.println("候机检票");
System.out.println("乘坐飞机中...");
System.out.println("到达目的地:" + destination);
System.out.println("===================");
}
}
/**
* @program: strategy
* @description: 大巴
* 具体策略角色(ConcreteStrategy)
* @author: wxw
* @create: 2024-03-09 14:55
**/
public class Bus implements ITripMode {
@Override
public void depart(String destination) {
System.out.println("===================");
System.out.println("您选择乘坐大巴前往:" + destination);
System.out.println("购买车票");
System.out.println("候车检票");
System.out.println("乘坐大巴中...");
System.out.println("到达目的地:" + destination);
System.out.println("===================");
}
}
/**
* @program: strategy
* @description: 私家车
* 具体策略角色(ConcreteStrategy)
* @author: wxw
* @create: 2024-03-09 14:55
**/
public class Car implements ITripMode {
@Override
public void depart(String destination) {
System.out.println("===================");
System.out.println("您选择自驾前往:" + destination);
System.out.println("汽车加油");
System.out.println("驾驶汽车中...");
System.out.println("到达目的地:" + destination);
System.out.println("===================");
}
}
上下文角色(Context)
/**
* @program: strategy
* @description: 出行方式上下文
* 上下文角色(Context)
* @author: wxw
* @create: 2024-03-09 15:01
**/
public class TripContext {
private static HashMap<String, ITripMode> tripModeHashMap = new HashMap<>();
private static final TripContext INSTANCE = new TripContext();
private TripContext(){
}
public static TripContext getInstance(){
return INSTANCE;
}
static {
tripModeHashMap.put("1", new HighSpeedTrain());
tripModeHashMap.put("2", new Plane());
tripModeHashMap.put("3", new Bus());
tripModeHashMap.put("4", new Car());
}
public void depart(String mode, String destination){
ITripMode iTripMode = tripModeHashMap.get(mode);
iTripMode.depart(destination);
}
}
客户端调用
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的目的地:");
String destination = scanner.nextLine();
System.out.println("请输入您选择的出行方式:1-高铁、2-飞机、3-大巴、4-自驾");
String mode = scanner.nextLine();
TripContext tripContext = TripContext.getInstance();
tripContext.depart(mode, destination);
}
}
输出结果
请输入您的目的地:
长沙
请输入您选择的出行方式:1-高铁、2-飞机、3-大巴、4-自驾
2
===================
您选择乘坐飞机前往:长沙
购买飞机票
候机检票
乘坐飞机中...
到达目的地:长沙
===================