设计模式之策略模式在项目中的应用

设计模式之策略模式在项目中的应用,第1张

策略模式简介:
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

策略模式组成:
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端调用。

上面内容来自百度百科!!!

策略模式实现:
下面的内容根据实际项目中策略模式的应用修改而来,只参考代码结构,和原有业务毫无关系。

/**
 * @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的相关方法
         */
    }
}

结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/905380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存