`
jguangyou
  • 浏览: 369543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

策略模式(Strategy)

阅读更多

     策略模式属于对象的行为模式。目的是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而可以使他们可以相互替换。策略模式使得算法可以在不影响客户端的情况下发生变化。

    主要角色:

  • 环境角色:持有对Strategy的引用。
  • 抽象策略角色
  • 具体策略角色:包装了具体的算法。

适用场合:

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
  •  如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则。客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
  • 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复发的和只与算法有关的数据。

 比如说要开发一个计算器,有加减乘除四种算法,可以这样去设计,类图如下:


环境角色:

package com.dp.strategy;

public class Calculator{
	private Calculate ca;

	public Calculator(Calculate ca){
		this.ca = ca;
	}
	public int result(int a,int b){
		return st.operation(a,b);
	}
}

 
 抽象策略角色:

package com.dp.strategy;

public interface Calculate {
	public int operation(int a,int b);
}

 下面是具体的策略

加法:

package com.dp.strategy;

public class AddCalculate implements Calculate{	
	@Override
	public int operation(int a,int b) {
		
		return a+b;
	}

}

 减法:

package com.dp.strategy;

public class MinusCaculate implements Calculate{	
	@Override
	public int operation(int a,int b) {
		
		return a-b;
	}

}

 

乘法:

package com.dp.strategy;

public class MultiplyCalculate implements Calculate{	
	@Override
	public int operation(int a,int b) {
		
		return a*b;
	}

}

除法:

package com.dp.strategy;

public class DivideCalculate implements Calculate{	
	@Override
	public int operation(int a,int b) {
		
		return a/b;
	}

}

  测试:

package com.dp.strategy;

public class Test {

   	 public static void main(String[] args) {
                 Calculator ca = new Calculator(new AddCalculate ());	
                  System.out.println(ca.result(1,2));
	ca = new 	Calculator(new MinusCaculate ());
                System.out.println(ca.result(1,2));

	}

}

策略模式在Hibernate中就有使用, 在使用Hibernate是需要配置一个sql的方言Dialect,不同的数据库是不同的,你可以根据你选择使用的数据库去配置不同的Dialect,这个就是一个策略模式。

这个东西大概就是这个意思,有疏漏之处多多指教....

  • 大小: 34.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics