晚上睡不着,想了想这两天研究的策略模式,刚才灵光一闪,脑子里突然发问 “为什么要用策略模式?”
之后上网各种查资料,然后翻看书籍,得到结果如下:
首先, 所有的设计模式都是为了更方便(更少的代码量),更优(性能消耗更小)的方式来开发而整理出来的一些套路,而策略模式 则是为了解决我们的在相同的问题中,不同的解决方式而产生的代码设计,代码解藕。
举例如下: 数据库大家都了解,如果我们在开发中需要依据不同的情况连接不同的数据库,如oracle,mysql...等等一些数据库。
按照传统开发而言,我们因该写一个class,里面有两个方法,一个连接oracle,一个连接mysql,在每次使用的使用 new 出来这么一个连接类来使用,一旦要增加或者修改连接数据库的方式都需要对代码进行重复修改,而策略模式,则是在我们需要的时候来选择需要new的class就可以,我们只需要在第一次使用的时候写好连接数据库的class类就可以,比如,设计一个连接数据库的接口,接口中只有连接数据库一个方法,之后再写多个class并实现连接数据库接口,用于不同的数据库连接,每次使要新增连接数据库方式的时候都可以通过新增class解决,不需要对原有代码进行修改。(我觉得这种方式替代了if else, 而且还有了更好的扩张性)。
参考代码如下
定义连接数据库接口
public interface ConnectDb { void connectMethod(); }
定义实现数据库的方式,如oracle,mysql
public class ConnectOracle implements ConnectDb{ @Override public void connectMethod() { System.out.println("连接oracle数据库"); } }
public class ConnectMysql implements ConnectDb{ @Override public void connectMethod() { System.out.println("连接mysql"); } }
调用test方法测试
@SpringBootTest public class Test { @org.junit.jupiter.api.Test public void testStrategy(){ ConnectDb connectDbMysql = new ConnectMysql(); connectDbMysql.connectMethod();//输出 mysql连接 ConnectDb connectDbOracle = new ConnectOracle(); connectDbOracle.connectMethod();;//输出 oracle连接 } }
上述测试方法个人觉得有点lou,改一下
@SpringBootTest public class Test { @Value("${connect.DB.class}") private String connectMethod; @org.junit.jupiter.api.Test public void testStrategy(){ try { ConnectDb connectDb = (ConnectDb)Class.forName(connectMethod).newInstance(); connectDb.connectMethod(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
采用配置文件来选择我需要实现的class,当然,class不一定非要用配置文件,如果想更灵活的话可以考虑存储到文件或者数据库中,根据不同的业务场景取出不同的class来进行实例化处理。
另外关于学习的总结如下,在遇到问题的时候一定要先想清楚,我为什么要学习这玩意,它能解决什么样子的问题?带着提出问题的观点去学习,我们才能发现更多的闪光点,诸君共勉。