策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端调用。
package mode.strategy;
/**
* @ClassName: IStrategy
* @Description: 定义了一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
* @author mpc
* @date 2014年12月31日 下午4:10:34
*
*/
public interface IStrategy {
public void operate();
}
package mode.strategy;
/**
* @ClassName: BackDoor
* @Description: 找乔国老帮忙,使孙权不能杀刘备
* @author mpc
* @date 2014年12月31日 下午4:12:19
*
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备。。。。。");
}
}
package mode.strategy;
/**
* @ClassName: GivenGreenLight
* @Description: 求吴国太开个绿灯
* @author mpc
* @date 2014年12月31日 下午4:14:26
*
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开绿灯,放行!");
}
}
package mode.strategy;
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵.........");
}
}
package mode.strategy;
/**
*
* 锦囊
*
* */
public class Context {
private IStrategy strategy;
// 构造函数,要使用带有哪个妙计的锦囊
public Context(IStrategy stragtegy) {
this.strategy = stragtegy;
}
public void operate() {
this.strategy.operate();
}
}
package mode.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("---------------第一步搞定--------------------------------");
//刘备乐不思蜀的时候拆开第二个
System.out.println("--------------乐不思蜀了,拆开第二个-------------------------------");
context=new Context(new GivenGreenLight());
context.operate();
System.out.println("----------------第二步搞定---------------------------------------------");
//孙权的追兵到了,拆开第三个
System.out.println("---------------孙权的追兵到了,拆开第三个------------------------------------------------");
context = new Context(new BlackEnemy());
context.operate();
System.out.println("---------------------终了----------------------------------------------------");
}
}