策略模式简介:
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式组成:
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端调用。
上面内容来自百度百科!!!
策略模式实现:
下面的内容根据实际项目中策略模式的应用修改而来,只参考代码结构,和原有业务毫无关系。
/**
* @author zy
* @version 1.0.0
* @ClassName TravelContext.java
* @Description 策略类的使用者,例如我们出行可以通过不同维度(时间、金钱等)选择不同的交通工具,但是我们最终的目的是一样的,
* 因此,我们只需要把这些工具抽象不同的策略,通过一个统一的策略类管理。这样,我们可以省去一大堆重复的代码和判断,让带啊吗看
* 起来更加简洁
* @createTime 2022/5/10
*/
public class TravelContext {
final static String PLANE = "PLANE";
final static String BUS = "BUS";
final static String TRAIN = "TRAIN";
public static void main(String[] args) throws Exception {
TravelTemplate template = TravelTemplate.getInstance(PLANE);
/**
* 公共方法的调用,不管哪种方式都需要填写身份z信息和手机号信息
*/
template.validate("123","张三");
template.setPhone("123456789");
/**
* 调用抽象的pay方法,由策略类去对应的策略执行
*/
template.pay();
}
}
/**
* @author zy
* @version 1.0.0
* @ClassName TravelTemplate.java
* @Description 抽象策略类,可以是接口,也可以是抽象类,主要负责定义一些公用方法,实例化具体的策略类提供给调用者,例如下面这个出行交通策略
* @createTime 2022/5/10
*/
public abstract class TravelTemplate{
public static final TravelTemplate getInstance(String carType) throws Exception {
switch (carType){
case "BUS":
return TravelStrategyMode.Bus.getInstance();
case "PLANE":
return TravelStrategyMode.Plane.getInstance();
case "TRAIN":
return TravelStrategyMode.Train.getInstance();
default:
throw new Exception("不支持的出行方式!");
}
}
/**
* 在策略模式的抽象类中定义一些符合具体类的公告方法,例如买票前校验身份z、等级预留电话等,这里只是举个例子,实际需要根据业务情况判断
*/
public void validate(String certNo,String name){
//省略一堆业务逻辑
System.out.println("校验成功!");
}
public void setPhone(String phone){
//省略一堆业务
System.out.println("预留手机号已保存!");
}
/**
* 抽象统一的私有方法调用,根据不同的模式去对应具体的策略支付
*/
abstract void pay();
}
/**
* @author zy
* @version 1.0.0
* @ClassName TravelStrategyMode.java
* @Description 下面是具体的策略类,例如每种方式都有自己相应的费用、路线等等,当然,最好是每个具体的策略抽成一个单独的类,我这里只是简单实现
* @createTime 2022/5/10
*/
public class TravelStrategyMode {
public static class Bus extends TravelTemplate{
static Bus getInstance(){
return new Bus();
}
private Bus(){
}
public void pay(){
System.out.println("需要支付100元!");
}
/**
* 省略一系列bus的相关方法
*/
}
public static class Train extends TravelTemplate{
static Train getInstance(){
return new Train();
}
private Train(){
}
public void pay(){
System.out.println("需要支付500元!");
}
/**
* 省略一系列Train的相关方法
*/
}
public static class Plane extends TravelTemplate{
static Plane getInstance(){
return new Plane();
}
private Plane(){
}
public void pay(){
System.out.println("需要支付1000元!");
}
/**
* 省略一系列Plane的相关方法
*/
}
}
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)