策略模式定义了一系列的算法。并将每个算法封装起来。并且使它们还能够相互替换。
策略模式让算法独立于使用它的客户而独立变化。
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—详细策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,终于给client调用。
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("---------------------终了----------------------------------------------------"); } }