设计模式 策略模式的适用场景和使用方法

162 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

策略模式也称为政策模式

属于对象的行为模式

适用场景:当一件任务可以使用不同的方式来完成,就可以使用策略模式。

使用方法:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换

一 适用场景

商场搞活动,不同的方式来计算实付金额可以使用策略模式

比如你去商场买东西,商场正在搞活动,有的商品可以打折购买,有的商品参加满减,还有的商品抽奖后直接免单。这种情况就可以使用策略模式。

去买东西计算你最后应支付的金额就是一个任务,计算实付金额有三种方式:打折扣、满多少减多少、直接免单不用付钱。

买单时,不同的支付方式可以使用策略模式

比如你去购物,可以使用微信、支付宝、现金、刷卡等不同的方式来支付。

也可以使用策略模式。

使用不同的交通工具去目的地,可以使用策略模式。

再比如,你要去旅行,你可以选择飞机、高铁、自驾游到目的地。也可以使用策略模式。

你要到达旅游的目的地是一个任务,有三种方式都可以到达,不同的交通方式时间不同,实现代码如下。

总之,就是达到一个目的,有不同的方式,且这些方式之间可以互换选择,就可以使用策略模式。

二 使用方法

以使用不同的交通工具去旅行为例,代码如下。

package com.qing.clms;

public interface ITravelByWhat {
    void travel(int km);
}

坐飞机

package com.qing.clms;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

public class ByAirplane implements ITravelByWhat{
    @Override
    public void travel(int km) {
        System.out.println("乘飞机需要"+Math.round(km*0.3/300)+"小时");
    }
}

 开车

package com.qing.clms;

public class ByCar implements ITravelByWhat {
    @Override
    public void travel(int km) {
        System.out.println("自己开车走高速需要" + Math.round(km * 1.1 / 80) + "小时");
    }
}

坐高铁

package com.qing.clms;

public class ByHighspeedRail implements ITravelByWhat{
    @Override
    public void travel(int km) {
        System.out.println("坐高铁需要"+Math.round(km*1.05/250)+"小时");
    }
}

策略模式Context:

将不同的实现行为通过参数传入策略模式Context的构造方法,可以在使用这些行为的类中消除条件语句

package com.qing.clms;

public class Context {
    private ITravelByWhat travelByWhat;

    public Context(ITravelByWhat travelByWhat) {
        this.travelByWhat = travelByWhat;
    }

    public void getResult(int km){
        travelByWhat.travel(km);
    }
}

测试

通过策略模式的有参构造函数选择了实现行为 ( → 在使用这些行为的类中消除条件语句。)

    @Test
    void test1() {
        Context context1 = new Context(new ByCar());
        context1.getResult(3000);
        Context context2 = new Context(new ByAirplane());
        context2.getResult(3000);
        Context context3 = new Context(new ByHighspeedRail());
        context3.getResult(3000);
    }

结果