Java设计模式之002--策略模式
策略模式(Strategy Pattern) :定义了一系列的算法, 将每一种算法封装起来并可以相互替换使用, 策略模式让算法独立于使用它的客户应用而独立变化。
OO设计原则:
1.面向接口编程(面向抽象编程);
2.封装变化;
3.多用组合, 少用继承 ;
当一个功能有多种实现方式时, 我们应该使用策略设计模式, 把功能抽象出来, 然后用不同的子类各自提供实现类, 在真正使用时, 根据业务情况来动态替换
把可变的行为抽象出来, 这样的好处是这些行为可以在真正使用时相互替换。
策略模式的实际应用:
1.数据库操作封装;
2.微信扫码登录注册绑定操作 ;
举例说明:将数据保存到不同的地方,比如文件、网络、数据库中。
a.创建接口,以供不同方式去实现
public interface ISave { public void save(String data);}
b.以供不同方式去实现接口中的方法
public class FileSave implements ISave{ @Override public void save(String data){ System.out.println("把数据["+data+"]存储到文件中"); }}
public class DBSave implements ISave{ @Override public void save(String data) { System.out.println("把数据["+data+"]存储到数据库中"); }} public class NetSave implements ISave{
@Override public void save(String data) { System.out.println("把数据["+data+"]存储到网络中"); }}
c.通过类来组合接口和接口的实现类,自上而下地调用具体不同对象的相同方法,来实现多态性
public class DataContext { private ISave iSave; //DataContext只依赖接口,不依赖具体的实现---->面向接口编程 public DataContext(ISave iSave){ this.iSave = iSave; } public void save1(String data){ iSave.save(data); //通过接口来调用具体对象的sava方法(父类调子类方法原理) }}
测试对比:
public class Test { public static void main(String[] args) throws Exception{//1 依赖了具体类 //1 ISave iSave = new FileSave(); //1 iSave.save("苦战Java一辈子!!"); //2 依赖接口(抽象类),具体的对象创建还要通过代码来改动//2 DataContext dc = new DataContext(new FileSave()); //2 dc.save1("苦战Java一辈子!!"); //3 依赖接口(抽象类),具体的对象类脱离到属性文件中(config.properties),而不是放在代码中 //让软件更加利于维护(提高程序的可扩张性),牺牲性能 Properties prop = new Properties(); //属性文件工具类 prop.load(Thread.currentThread().getContextClassLoader() .getResourceAsStream("config.properties")); //属性文件中(config.properties): context.save=NetSave String className = prop.getProperty("context.save"); ISave iSave = (ISave) Class.forName(className).newInstance(); DataContext dc = new DataContext(iSave); dc.save1("苦战Java一辈子!!"); }}
赞 (0)