AspectJ实现设计模式(二)——策略模式

原创 2003年07月22日 08:01:00

      本文将继续介绍使用AspectJ实现设计模式之策略模式,文章以一个图书折扣例子的形式描述了策略模式AspectJ版本的参考实现。

      策略模式把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则由具体的策略类实现。由于算法和环境独立开来,算法的增减,修改都不会影响环境和客户端。策略模式的简易UML图例如下

而使用AspectJ实现的策略模式UML图与之有很大的区别

Context和Strategy接口都由抽象方面StrategyProtocol声明,而具体的策略实现方面负责为具体策略类和环境类分别声明实现接口,并定义了pointcut discountStrategy用于捕捉特定算法的调用。该方面使用around advice实现对不同策略类的调用。下面就介绍实现的代码

StrategyProtocol抽象方面

public abstract aspect StrategyProtocol {
  protected interface Context{}
  protected interface Strategy{}
  private Strategy Context.strategy=null;
  public void Context.setStrategy(Strategy strategy){
    this.strategy=strategy;
  }
  public Strategy Context.getStrategy(){ return strategy;}
}

该方面使用Inter-type声明定义了Context和Strategy接口并为Context接口声明了管理策略类方法。

DiscountStrategyAspect.java

public aspect DiscountStrategyAspect extends StrategyProtocol{

  declare parents : Discount implements Context;//Discount为具体的环境类

  //定义了三种折扣算法,实现Strategy接口
  declare parents : NoDiscountStrategy implements Strategy;
  declare parents : FlatRateStrategy implements Strategy;
  declare parents : PercentageStrategy implements Strategy;
  pointcut discountStrategy(Context context) : target(context)

                                           && call(double Discount.getDiscount());

  //捕捉算法调用联结点(JoinPoint)
  double around(Context context) : discountStrategy(context){
    Strategy strategy = ((Discount)context).getStrategy();//抽象方面为Context定义的方法
    return getDiscount(strategy);
  }

  //调用特定的策略算法
  private double getDiscount(Strategy strategy){
    if(strategy instanceof NoDiscountStrategy)
      return ((NoDiscountStrategy)strategy).calculateDiscount();
    else if(strategy instanceof FlatRateStrategy)
      return ((FlatRateStrategy) strategy).calculateDiscount();
    else if(strategy instanceof PercentageStrategy)
      return ((PercentageStrategy)strategy).calculateDiscount();
    else
      throw new RuntimeException("No such strategy defined");
  }
}

Discount.java环境类

public class Discount{//没有实现getDiscount方法,由具体策略方面实现
  public  double getDiscount(){
    return 0;
  }
}

NoDiscountStrategy.java策略类

public class NoDiscountStrategy{
  private double price;
  private int copies;
  public NoDiscountStrategy(double price,int copies){
    this.price=price;
    this.copies=copies;
  }
  public double calculateDiscount(){
    return 0;
  }
}

FlatRateStrategy.java策略类

public class FlatRateStrategy{
  private double price;
  private int copies;
  private double amount;
  public FlatRateStrategy(double price,int copies,double amount){
    this.price=price;
    this.copies=copies;
    this.amount=amount;
  }
  public double calculateDiscount(){
    return amount*copies;
  }
}

PercentageStrategy.java策略类

public class PercentageStrategy{
  private double price;
  private int copies;
  private double percentage;
  public PercentageStrategy(double price,int copies,double percentage){
    this.price=price;
    this.copies=copies;
    this.percentage=percentage;
  }
  public double calculateDiscount(){
    return copies*price*percentage;
  }
}

以上三个策略类都有calculateDiscount方法,该方法实现不同的折扣策略

Demo.java测试代码

public class Demo {
    public static void main(String[] args) {
      double price=100;
      int copies=10;
      Discount discount=new Discount();
      discount.setStrategy(new NoDiscountStrategy(price,copies));
      System.out.println("Discount using No Discount Strategy is:"+discount.getDiscount());
      discount.setStrategy(new FlatRateStrategy(price,copies,20));
      System.out.println("Discount using Flat Rate 20 Discount Strategy is:" +discount.getDiscount());
      discount.setStrategy(new PercentageStrategy(price,copies,0.5));
      System.out.println("Discount using Percentage 50% Strategy is:" +discount.getDiscount());
    }
}

测试代码分别让环境类Discount使用了三个策略类并返回折扣值。其结果如下

Discount using No Discount Strategy is:0.0
Discount using Flat Rate 20 Discount Strategy is:200.0
Discount using Percentage 50% Strategy is:500.0

至此,我已经使用AspectJ完全实现了一个使用策略模式设计的折扣例子。本系列的下一篇文章将介绍如何用AspectJ实现工厂方法模式。(说明一点,本系列文章假设读者熟悉设计模式和AspectJ,所以不会过多介绍这方面的知识,主要是以示例为主,所有的例子都通过测试可以运行,因本人首次发表文章如有不足和错误还请各位多多原谅)。

 

 

参考资料

1.<<Java与模式>>   阎宏著   电子工业出版社

2.http://www.eclipse.org/aspectj/

 

声明

本文由starchu1981保留版权,如果需要转贴请写明作者和出处。

设计模式C++实现——策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。         策略模式UML图如下:           举例:         游泳池中有不...
  • walkerkalr
  • walkerkalr
  • 2014年06月04日 15:32
  • 1384

大话设计模式—策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义了...
  • lmb55
  • lmb55
  • 2016年03月23日 23:59
  • 1582

Java设计模式——策略模式实现及原理

简介 定义 策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。 策略模式中的设计原则:变化的抽象成接口;面向...
  • Goskalrie
  • Goskalrie
  • 2016年09月08日 16:22
  • 2603

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016年09月07日 21:16
  • 1110

PHP设计模式——策略模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变...
  • jhq0113
  • jhq0113
  • 2015年05月16日 22:15
  • 4101

python设计模式之策略模式

策略模式Strategy 模式和抽象工厂可能最难分辨,抽象工厂帮助我们根据我们的参数找到对应的操作工厂,而每个操作工厂提供了相同的接口函数 操作工厂所以可能是从一个基类继承的不同实现,举个例子,有个鸭...
  • leongongye
  • leongongye
  • 2015年07月29日 18:18
  • 357

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式。在这之前,先温习一下前面介绍的4种模式。设计模式很重要! 设计模式很重要! 设计模式很重要!重要的事说三遍!!! An...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年11月16日 11:50
  • 5294

策略模式+工厂方法 实现多分支操作(代替多个if else)

策略模式+工厂方法 实现多分支操作(代替多个if else)
  • kai763253075
  • kai763253075
  • 2016年09月10日 20:05
  • 2872

【设计模式】策略模式——以商场促销为例

本文内容参考自《大话设计模式》(程杰 著) 注:以下代码为java实现版本1需求:做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。关键代码:public class Cash {...
  • jiange_zh
  • jiange_zh
  • 2015年12月04日 14:25
  • 2073

JAVA设计模式之:策略模式

策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 策略模式一般由下面三部分组成: 1. ...
  • true100
  • true100
  • 2015年12月16日 15:23
  • 957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AspectJ实现设计模式(二)——策略模式
举报原因:
原因补充:

(最多只允许输入30个字)