第九讲:策略模式
Strategy:算法的抽象,比如说加密算法.
ConcreteStrategy:算法的具体实现,比如说MD5加密,或者是MDS加密.
Context是由外部环境决定的,意思是Context是由客户决定的.
//Context持有策略Strategy的引用..... //你具体要的是哪一个当你调用Context的operation()方法的时候它就给你执行哪一个 //策略模式和装饰模式有点像,同样都是包含对象的引用. //但是装饰模式是持有引用的类同样实现了接口,但是策略模式里面Context肯定不会去实现Strategy接口. public class Context { private Strategy strategy; public Context(Strategy strategy) { super(); this.strategy = strategy; } public void encrypt(){ this.strategy.encrypt();//由具体子类来调用加密.... } }
public class MainClass { public static void main(String[] args) { /* Strategy stra = new MD5Strategy();//这样就可以实现动态的改变,在客户端改变就可以了. //但是这不符合策略模式,策略模式还有一个核心是Context.Context可以看做是工厂,里面包含了Strategy的引用. stra.encrypt();*/ Context context = new Context(new MD5Strategy()); context.encrypt();//这里的好处在于是通过Context进行封装的... //通过调用encrypt这个方法来执行... //客户人员他所关心的是这个Context.而你实际上用的是MD5Strategy } }
//策略的具体的实现 public class MD5Strategy implements Strategy{ @Override public void encrypt() { System.out.println("执行MD5加密"); } }
public class MDSStrategy implements Strategy{ @Override public void encrypt() { System.out.println("执行MDS加密"); } }
//策略抽象类,抽象的接口 public interface Strategy { //加密 public void encrypt(); }
再做一个例子,商家要促销,打八折,或者是满一百送二十,满两百送多少...
package com.ibeifeng.strategy; //Context是对你的策略的具体的选择 //策略模式对不同的算法/策略是非常好用的. public class Context { private Strategy strategy;//持有策略的引用. public Context(Strategy strategy) { super(); this.strategy = strategy; } public double cost(double num){ return this.strategy.cost(num); } }
package com.ibeifeng.strategy; public class MainClass { public static void main(String[] args) { double num = 200; //Context context = new Context(new StrategyA()); Context context = new Context(new StrategyB()); //策略模式可以搭配工厂模式,判读选择是new一个对象.工厂模式对于对象的生成是非常方便的. //策略模式与工厂模式进行综合的应用 double newNum = context.cost(num); System.out.println("实际付账" +newNum + "元"); } }
package com.ibeifeng.strategy; //如果再增加一个策略,只要实现了Strategy接口然后再重写cost方法即可. public interface Strategy { public double cost(double num); }
package com.ibeifeng.strategy; //打八折 public class StrategyA implements Strategy{ @Override public double cost(double num) { return num * 0.8; } }
package com.ibeifeng.strategy; //满两百返还五十 public class StrategyB implements Strategy { @Override public double cost(double num) { if(num >= 200){ return num-50; } return num; } }
两种算法的公共部分可以抽取出来.
几个对象它的数据是相同的可以把它共享一下.
策略模式比装饰模式简单多了.装饰模式涉及到给对象添加使用类,策略模式只是持有对象的引用,然后实现你具体的方法.