本文已参与「新人创作礼」活动,一起开启掘金创作之路。
策略模式也称为政策模式
属于对象的行为模式。
适用场景:当一件任务可以使用不同的方式来完成,就可以使用策略模式。
使用方法:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
一 适用场景
商场搞活动,不同的方式来计算实付金额可以使用策略模式
比如你去商场买东西,商场正在搞活动,有的商品可以打折购买,有的商品参加满减,还有的商品抽奖后直接免单。这种情况就可以使用策略模式。
去买东西计算你最后应支付的金额就是一个任务,计算实付金额有三种方式:打折扣、满多少减多少、直接免单不用付钱。
买单时,不同的支付方式可以使用策略模式
比如你去购物,可以使用微信、支付宝、现金、刷卡等不同的方式来支付。
也可以使用策略模式。
使用不同的交通工具去目的地,可以使用策略模式。
再比如,你要去旅行,你可以选择飞机、高铁、自驾游到目的地。也可以使用策略模式。
你要到达旅游的目的地是一个任务,有三种方式都可以到达,不同的交通方式时间不同,实现代码如下。
总之,就是达到一个目的,有不同的方式,且这些方式之间可以互换选择,就可以使用策略模式。
二 使用方法
以使用不同的交通工具去旅行为例,代码如下。
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);
}
结果