Java设计模式之策略模式

  策略模式,完成一项任务,往往有许多种不同的方式,每一种方式称为一个策略,根据环境或者条件的不同选择不同的策略来完成该项任务。策略模式是一种对象行为模式。

策略模式结构图

  策略模式包含Context(环境类),Strategy(抽象策略类)和ConcreteStrategy(具体策略类)。
在这里插入图片描述

策略模式示例

  假设我们去旅游出行,旅游出行的方式可以有乘坐飞机旅游,也可以乘坐火车旅游,如果有兴趣自行车游也是一种极具乐趣的出行方式。每一种不同的旅游出行方式都有不同的实现过程,我们可以选择一种合适的旅游方式。旅游的人相当于Context(环境类),而那些各种出行的方式就是ConcreteStrategy(具体策略类)

  Strategy(抽象的策略类),定义了抽象策略类,有一个travel()方法:

/*抽象策略类*/
public interface TravelStrategy {

    void travel();
}

  ConcreteStrategy(具体策略类),下列定义了三个具体的策略类,分别是AirplaneStrategy,TrainStrategyBicycleStrategy,都实现了TravelStrategy接口:

/*具体策略类,乘坐飞机出行*/
public class AirplaneStrategy implements TravelStrategy {

    @Override
    public void travel() {
        System.out.println("乘坐飞机出行...");
    }
}

/*具体策略类,乘坐火车出行*/
public class TrainStrategy implements TravelStrategy {

    @Override
    public void travel() {
        System.out.println("乘坐火车出行...");
    }
}

/*具体策略类,自行车游*/
public class BicycleStrategy implements TravelStrategy {

    @Override
    public void travel() {
        System.out.println("自行车游...");
    }
}

  Context(环境类),是旅游的人,这里使用一个Person类来代表,如下所示:

/*环境类,选择指定的出行的方式*/
public class Person {
    TravelStrategy strategy;

    /*注入策略的setter*/
    public void setStrategy(TravelStrategy strategy) {
        this.strategy = strategy;
    }

    public void travel(){
        strategy.travel();
    }

}

  测试类实现如下:

/*测试类*/
public class Test {
    public static void main(String[] args) {
        //1.实例化环境类(Context)的对象
        Person person = new Person();
        //2.注入乘坐飞机出行的方式
        TravelStrategy strategy = new AirplaneStrategy();
        person.setStrategy(strategy);
        person.travel();

        System.out.println("==================================");
        strategy = new TrainStrategy();
        //2.注入乘坐火车出行的方式
        person.setStrategy(strategy);
        person.travel();

        System.out.println("==================================");
        strategy = new BicycleStrategy();
        //2.注入自行车游出行的方式
        person.setStrategy(strategy);
        person.travel();
    }
}

  测试程序执行结果:
在这里插入图片描述

  客户端的调用,只需要注入一个具体的策略对象即可,增加新的策略类也很方便,如果有新的策略则让新的策略类实现对应的抽象接口即可。策略模式不负责“为什么不能从策略模式看出哪一个具体策略适用于哪一种情况”,这一个决定。需要由客户端自行决定什么情况下使用什么策略角色。

什么场景下使用策略模式

  在某些情况下,解决问题的方案和实现由很多种,往往不止一种,这个时候就可以考虑使用策略模式来实现各种方案,然后在需要切换其他方案时,可以比较容易的切换。

策略模式优缺点

优点:可以在不不修改原有系统的基础上选择行为,也可以灵活的增加新的行为。

缺点:客户端必须知道所有的策略类,并且自行决定使用哪一个策略类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值