策略模式(Strategy Pattern)

策略模式

说明

策略模式(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
===================
您选择乘坐飞机前往:长沙
购买飞机票
候机检票
乘坐飞机中...
到达目的地:长沙
===================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值