策略模式:将可变的部分(比如:排版算法,支付算法)抽象分离成算法接口,在该接口下封装一系列的算法实现,并使他们可以相互替换
策略模式体现的设计原则:
1.封装变化,把会变化的部分封装起来,让其他部分不受到影响。使代码更加有弹性。
2.面向接口编程,而不是面向实现编程。更易于维护和扩展,更有条理。
例子:博客http://yangguangfu.iteye.com/blog/815107
��三个妙计是同一类型的东西,那咱就写个接口:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:阿福
* 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。
*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法。
public void operate();
}
然后再写三个实现类,有三个妙计嘛:
妙计一:初到吴国:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:阿福
* 找乔国老帮忙,使孙权不能杀刘备。
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
}
}
妙计二:求吴国太开个绿灯,放行:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:阿福
* 求吴国太开个绿灯。
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}
妙计三:孙夫人断后,挡住追兵:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:阿福
* 孙夫人断后,挡住追兵。
*/
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵...");
}
}
好了,大家看看,三个妙计是有了,那需要有个地方放妙计啊,放锦囊里:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:阿福
*
*/
public class Context {
private IStrategy strategy;
//构造函数,要你使用哪个妙计
public Context(IStrategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
package com.yangguangfu.strategy;
public class ZhaoYun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
*/
public static void main(String[] args) {
Context context;
//刚到吴国的时候拆开第一个
System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
context = new Context(new BackDoor());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
//当刘备乐不思蜀时,拆开第二个
System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
context = new Context(new GivenGreenLight());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
//孙权的小追兵了,咋办?拆开第三个锦囊
System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
context = new Context(new BlackEnemy());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}
应用场景:
1、 许多相关类只是行为差异
2、运行时选取不同的算法变体
3、通过条件语句在多个分支中选取一个
优点:
对于Strategy模式来说,主要有如下优点:
1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
慕课网鸭子例子的详细解释见博客:
http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html