首页 > 代码库 > [设计模式]策略模式

[设计模式]策略模式

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方法,控制台输出如下,实现了不同算法间的切换

技术分享

[设计模式]策略模式