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