设计模式-策略模式

概念

其思想是针对一组算法,将每一种算法都封装到具备共同接口的独立的类中,从而使它们能够相互替换。策略模式最大的特色是使得算法能够在不影响客户端的状况下发生变化,从而改变不一样的功能。算法


特色

策略模式体现了面向对象程序设计中很是重要的两个原则:编程

  1. 封装变化的概念
  2. 编程中使用接口,而不是使用具体的实现类(面向接口编程)

举例:
以 Java 中的 TreeSet 为例,TreeSet 仅仅知道它只是接收一个 Comparator 这种接口类型,可是具体是哪一种实现类,TreeSet 并不关心,实现类在真正的传入 TreeSet 以前,TreeSet 自己是不知道的,因此能够本身去实现 Comparator 接口,而后在实现类里面去封装本身的规则(这里的规则能够看成是算法),好比说要实现对一个集合元素的排序,究竟是升序仍是降序由本身控制,能够把这种变化的内容封装到本身的实现类中,真正运行的时候才知道具体的实现。
测试


组成

  1. 抽象策略角色
    这个是一个抽象的角色,一般状况下使用接口或者抽象类来定义。对比来讲,就是 TreeSet 中的 Comparator。
  2. 具体策略角色
    包装了具体的算法和行为。对比来讲,就是实现了 Comparator 接口的一组实现类。
  3. 环境角色
    内部会持有一个抽象角色的引用,给客户端调用。对比说,就是 TreeSet 类。说明:TreeSet 内部必定会有一个策略类的成员变量,这样作的目的在于当去建立 TreeSet 对象的时候,能够接收向 TreeSet 类中传递的具体的策略类。
    注意:在 TreeSet 的源码中其实并无 Comarator 的引用,可是在 TreeSet 的构造方法中是用 TreeMap 来构造 TreeSet 的,
public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

也就是说 TreeSet 在底层使用 TreeMap 来实现的,而在 TreeMap 中持有 Camparator 的引用,private final Comparator<? super K> comparator;this


编写步骤

  1. 定义抽象的策略角色(为策略对象定义一个公共的接口)
  2. 编写具体的策略角色(实际上就是实现上面定义的公共接口)
  3. 定义环境角色,内部持有一个抽象策略角色的引用

案例

  1. 定义抽象策略角色
/**
 *	定义抽象策略角色
 *	相似于Comparator 接口
*/
public interface Strategy{
	/**
	 *	定义了两个数用于计算
	*/
	public int calc(int num1, int num2);
}
  1. 定义具体策略角色(定义加、减两种策略)
/**
 *	定义加法策略
*/
public class AddStrategy implements Strategy{
	/**
	 *	实现calc 方法,完成两个数相加
	*/
	public int calc(int num1, int num2){
		return num1 + num2;
	}
}
/**
 *	减法策略
*/
public class SubtractStrategy implements Strategy{
	/**
	 *	实现calc方法,完成两个数相减
	*/
	public int calc(int num1, int num2){
		return num1 - num2;
	}
}
  1. 环境角色
/**
 *	环境角色
 *	相似于 TreeSet(其实是TreeMap)
*/
public class Environment{
	// 持有对策略类的引用
	private Strategy strategy;
	// 经过构造方法给抽象策略类的引用赋值
	public Environment(Strategy strategy){
		this.strategy = strategy;
	}
	public int calulate(int a, int b){
		retrun strategy.calc(a,b);
	}
}
  1. 测试类
/**
 *	测试类
*/
public class Test{
	public static void main(String[] args){
		// 传入具体的策略类构造策略对象以抽象策略角色接收(多态)
		Environment environment = new Environment(new AddStrategy());
		int result environment.calulate(1,2);
		System.out.println(result);
	}
}
相关文章
相关标签/搜索