zoukankan      html  css  js  c++  java
  • JAVA设计模式之策略模式

    设计原则中有个开闭原则(对修改关闭,对新增开放)。策略模式就是遵循了这种思想

    场景:五一快放假了,很多人选择回家,那么选择什么样的交通工具呢,这种交通工具就是回家的策略。

    1、回家策略接口

    /**
     * 抽象接口,回家的策略
     */
    abstract public interface AbstractGoHomeStrategy {
        void goHomeByWhat();
    }

    2、做火车回家策略

    /**
     * 坐火车回家,具体的实现策略
     */
    public class TrainStrategy implements AbstractGoHomeStrategy{
        @Override
        public void goHomeByWhat() {
            System.out.println("Take the train home");
        }
    }

    3、做高铁回家

    /**
     * 坐高铁回家,具体的实现策略
     */
    public class HighSpeedRailStrategy implements AbstractGoHomeStrategy {
        @Override
        public void goHomeByWhat() {
            System.out.println("Take the high speed Rail home");
        }
    }

    4、放假类

    /**
     * 五一快放假了准备干什么
     */
    public class Holiday {
    
        /**
         * 回家
         */
        public void howGoHome(AbstractGoHomeStrategy ags){
            ags.goHomeByWhat();
        }
    
        /**
         * 学习
         */
        public void study(){
    
        }
    }

    5、测试类

    /**
     * 测试类
     */
    public class T {
        public static void main(String[] args) {
            Holiday h = new Holiday();
            AbstractGoHomeStrategy ags1 = new TrainStrategy();
            AbstractGoHomeStrategy ags2 = new HighSpeedRailStrategy();
            //想用哪种策略回家把回家策略传进去就ok
            h.howGoHome(ags2);
        }
    }

    到这里,大家看到了,每次想用哪个策略都需要new一个策略对象,还是带来了代码的修改,如果做到不修改呢,请看下面

    6、在classpath下添加策略配置文件config.properties

    #回家策略
    gohomeStrategy = com.srr.pd.strategy.TrainStrategy

    7、添加属性配置文件工具类

    package com.srr.pd.strategy;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    public class PropertiesUtil {
    
        /* 私有构造方法,防止被实例化 */
        private PropertiesUtil (){};
        public static Properties propertie = null;
        static {
            propertie = new Properties();
            InputStream inputStream = PropertiesUtil.class.getResourceAsStream("/config.properties");
            //解决中文乱码
            BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream));
    
            try {
                propertie.load(buff);
                inputStream.close();
            } catch (IOException e) {
            }
        }
    
        public static void main(String[] args) {
            System.out.println("gohomeStrategy = "+PropertiesUtil.propertie.get("gohomeStrategy"));
        }
    }

    8、修改测试类后

    package com.srr.pd.strategy;
    
    /**
     * 测试类
     */
    public class T {
    
        public static void main(String[] args) {
            Holiday h = new Holiday();
            AbstractGoHomeStrategy ags1 = new TrainStrategy();
            String strategy = (String) PropertiesUtil.propertie.get("gohomeStrategy");
            AbstractGoHomeStrategy ags = null;
            try {
                ags = (AbstractGoHomeStrategy) Class.forName(strategy).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //想用哪种策略回家把回家策略在配置文件中配置好就ok
            h.howGoHome(ags);
        }
    }
  • 相关阅读:
    java----使用socket模拟简单的http请求服务器,响应简单的文件请求操作
    Java实现的断点续传功能
    C 语言——分支和跳转
    C 语言——嵌套循环例子
    C 语言——循环
    C 语言——运算符、表达式和语句
    C 语言——字符串和格式化输入/输出
    C 语言——基础概论
    C 语言——开篇
    IDEA的安装教程
  • 原文地址:https://www.cnblogs.com/sx-bj-srr/p/strategy.html
Copyright © 2011-2022 走看看