`

行为型模式--策略模式(strategy)

阅读更多

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:

图中ICalculator提供同意的方法,
AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:

首先统一接口:

[java] view plaincopy
  1. public interface ICalculator {  
  2.     public int calculate(String exp);  
  3. }  

辅助类:

[java] view plaincopy
  1. public abstract class AbstractCalculator {  
  2.       
  3.     public int[] split(String exp,String opt){  
  4.         String array[] = exp.split(opt);  
  5.         int arrayInt[] = new int[2];  
  6.         arrayInt[0] = Integer.parseInt(array[0]);  
  7.         arrayInt[1] = Integer.parseInt(array[1]);  
  8.         return arrayInt;  
  9.     }  
  10. }  

三个实现类:

[java] view plaincopy
  1. public class Plus extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"\\+");  
  6.         return arrayInt[0]+arrayInt[1];  
  7.     }  
  8. }  
[java] view plaincopy
  1. public class Minus extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"-");  
  6.         return arrayInt[0]-arrayInt[1];  
  7.     }  
  8.   
  9. }  
[java] view plaincopy
  1. public class Multiply extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"\\*");  
  6.         return arrayInt[0]*arrayInt[1];  
  7.     }  
  8. }  

简单的测试类:

[java] view plaincopy
  1. public class StrategyTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String exp = "2+8";  
  5.         ICalculator cal = new Plus();  
  6.         int result = cal.calculate(exp);  
  7.         System.out.println(result);  
  8.     }  
  9. }  

输出:10

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

============================================================




 
public interface MemberStrategy {  
    /** 
     * 计算图书的价格 
     *  
     * @param booksPrice 
     *            图书的原价 
     * @return 计算出打折后的价格 
     */
    public double calcPrice(double booksPrice);  
}
 
public class PrimaryMemberStrategy implements MemberStrategy {  
      
    @Override
    public double calcPrice(double booksPrice) {  
      
        System.out.println("对于初级会员的没有折扣");  
        return booksPrice;  
    }  
      
}
  
public class IntermediateMemberStrategy implements MemberStrategy {  
      
    @Override
    public double calcPrice(double booksPrice) {  
      
        System.out.println("对于中级会员的折扣为10%");  
        return booksPrice * 0.9;  
    }  
      
}
 
public class AdvancedMemberStrategy implements MemberStrategy {  
      
    @Override
    public double calcPrice(double booksPrice) {  
      
        System.out.println("对于高级会员的折扣为20%");  
        return booksPrice * 0.8;  
    }  
}
 
public class Price {  
    // 持有一个具体的策略对象  
    private MemberStrategy strategy;  
      
    /** 
     * 构造函数,传入一个具体的策略对象 
     *  
     * @param strategy 
     *            具体的策略对象 
     */
    public Price(MemberStrategy strategy) {  
        this.strategy = strategy;  
    }  
      
    /** 
     * 计算图书的价格 
     *  
     * @param booksPrice 
     *            图书的原价 
     * @return 计算出打折后的价格 
     */
    public double quote(double booksPrice) {  
        return this.strategy.calcPrice(booksPrice);  
    }  
}
 
public class Client {  
      
    public static void main(String[] args) {  
        // 选择并创建需要使用的策略对象  
        MemberStrategy strategy = new AdvancedMemberStrategy();  
              
        // 创建环境  
        Price price = new Price(strategy);  
        // 计算价格  
        double quote = price.quote(300);  
        System.out.println("图书的最终价格为:" + quote);  
              
    }  
      
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics