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);
    }
}
posted @ 2020-04-26 22:45  引路的风  阅读(402)  评论(1编辑  收藏  举报