java 策略设计模式 --- 接口应用

       策略模式:定义一系列的算法,将每一种算法封装起来,并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。

    在生活中,假如我们有一堆数据需要保存,可能保存为文件,可能保存带数据库,也可能保存到网上。我们平常的想法是定义一些列类,每次使用哪个存储方法,就新建一个新的对象,来调用方法。这样的话既费时又费力,方法多次重写,还增加了类与类之间的耦合性。 不利于我们的开发。

    我可以把所有相似的类的共同可变的行为抽象出来,定义一系列的算法,独立出来,脱离用户,绑定接口,方便使用和扩展

OO设计原则:

  1. 面向接口编程
  2. 封装变化
  3. 多用组合,少用继承

代码实例:

  1. 首先定义一个接口,建立一个保存的抽象方法
public interface ISave {
	public void save(String data);
}
  1. 定义一系列的算法,来完成相似的功能
public class NetSave implements ISave{
	public void save(String data) {
		System.out.println("正在把数据存到网上"+data);
	}
}
public class FileSave implements ISave{
	public void save(String data) {
		System.out.println("正在把数据存到文件中"+data);
	}
}
public class SqlSave implements ISave{
	public void save(String data) {
		System.out.println("正在把数据保存到数据库"+data);
	}
}
  1. 新建一个保存的类,本类与要保存什么文件无关,与组合的是什么接口无关,为对象调用接口的功能做转换。
/**
* 象类,组合了一个接口,给出设置接口的一个方法,和保存的方法
*/
public abstract class BaseService {
	private ISave iSave;   //组合一个接口,作为本类的属性
	public void setISave(ISave iSave) {
		this.iSave = iSave;
	}
	public void add(String data) {
		System.out.println("正在检查数据...");
		iSave.save(data);
		System.out.println("数据保存完毕。");
	}
}
//具体的类,可以根据业务要求,添加不同的功能
public class UserService extends BaseService{}
  1. 测试类,查看策略模式的实现
public class Test {

	public static void main(String[] args) {
		/*
		 *   多态形式的实例化对象
		 */
		BaseService user = new UserService();
		user.setISave(new FileSave());
		user.add("mydata");
		
		user.setISave(new NetSave());
		user.add("data");
		
		user.setISave(new SqlSave());
		user.add("aaaa");
	}
}

结果如下:
java 策略设计模式 --- 接口应用

看完代码再去回顾一下策略设计模式的定义,是不是又有新的体会呢?

对于我的抽象类或者UserService类来说,你是把数据保存到文件中,还是保存到网络上来说,完全没有关系了。只是保存了接口,对于接口是谁,我也不关心。


策略模式的优点:

● 算法可以*切换
这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可*切换”的策略。

● 避免使用多重条件判断
如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要使用A策略,一会要使用
B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

● 扩展性良好
这甚至都不用说是它的优点,因为它太明显了。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符合了OCP原则。

策略模式的缺点:
● 策略类数量增多 每一个策略都是一个类,复用的可能性很小,类数量增多。
● 所有的策略类都需要对外暴露
策略模式的使用场景:
● 多个类只有在算法或行为上稍有不同的场景。
● 算法需要*切换的场景。
● 需要屏蔽算法规则的场景。