码迷,mamicode.com
首页 > 其他好文 > 详细

[设计模式]策略模式

时间:2015-01-01 23:40:16      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享

[设计模式]策略模式

标签:

原文地址:http://www.cnblogs.com/jerry19890622/p/4197305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!