1. 定义
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响使用算法的客户。
2. 类图
Strategy定义所有算法的公共接口
public interface Strategy { public void algorithmInterface(); }
具体算法实现,定义了三种算法,分别为ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC
public class ConcreteStrategyA implements Strategy { public void algorithmInterface() { //算法A } } public class ConcreteStrategyB implements Strategy { public void algorithmInterface() { //算法B } } public class ConcreteStrategyC implements Strategy { public void algorithmInterface() { //算法C } }
上下文包含一个Strategy具体策略对象
public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void contextInterface() { this.strategy.algorithmInterface(); } }
3.使用策略模式实现针对不同顾客报价小列子
package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:44:31 */ public interface Strategy { double calcPrice(double price); } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:46:04 */ public class NormalCustomerStrategy implements Strategy{ @Override public double calcPrice(double price) { // TODO Auto-generated method stub System.out.println("对于新顾客或普通顾客,没有折扣"); return price; } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:49:00 */ public class OldCustomerStrategy implements Strategy{ @Override public double calcPrice(double price) { // TODO Auto-generated method stub System.out.println("对于老顾客,打5%折扣"); return price * (1 - 0.05); } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:50:27 */ public class VipStrategy implements Strategy{ @Override public double calcPrice(double price) { // TODO Auto-generated method stub System.out.println("对于VIP顾客,打10%折扣"); return price * (1 - 0.1); } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:51:22 */ public class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public double quote(double price) { return this.strategy.calcPrice(price); } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月1日 下午10:53:04 */ public class Client { public static void main(String[] args) { Context context = new Context(); Strategy normal = new NormalCustomerStrategy(); context.setStrategy(normal); System.out.println("报价为:" + context.quote(1000)); Strategy old = new OldCustomerStrategy(); context.setStrategy(old); System.out.println("报价为:" + context.quote(1000)); Strategy vip = new VipStrategy(); context.setStrategy(vip); System.out.println("报价为:" + context.quote(1000)); } }
执行main方法,控制台输出如下,实现了不同算法间的切换