Interface plays as Placeholder, without any class implement it

    技术2022-05-11  64

    Interface play as Placeholder, without any class implement itAuthor:Anders小明

    有个这个题目是在ApectJ的应用,以及博客园子中一个blog讨论什么时候用接口(一个很古老的话题)。接口作为一种重要的抽象能力,重要意义在于:模型上看:接口代表做什么,而实现表示怎么做!在框架上:接口代表稳定,而实现代表多变!在语言上:接口代表0,而实现代表1,通过对象类型消除if…else…。(这段话我<<Domain Model:业务流程的进一步分析2>>提过)既然是应用开发,模型角度看根据现实意义,没有AspectJ前的开发,都是设计好一个接口,然后至少一个实现类,然后通过factory获取正确的实现类,后来spring出现了,实现了IoC。然而由于AspecJ横空出世了,我们又多了一种手段:接口作为占位符, 而没有实现类(当然有实现)。这是我在看到partech的sunflower的代码后才想到的!虽然我在<<AOSD:应用AOP实现业务逻辑>>一文中已经想到了一些,然而还是没有partech来的狠!下面是一个简单的例子:Order类

    package  placeholder; import  java.util.Date; /** * @author Anders.Lin * */ public   class  Order  private String orderCode; private Date commerceDate; private Long userId;  public Order(){   }  public Order(String orderCode, Date commerceDate, Long userId){  this.orderCode = orderCode;  this.commerceDate = commerceDate;  this.userId = userId; } public Date getCommerceDate() {  return commerceDate; } public void setCommerceDate(Date commerceDate) {  this.commerceDate = commerceDate; } public String getOrderCode() {  return orderCode; } public void setOrderCode(String orderCode) {  this.orderCode = orderCode; } public Long getUserId() {  return userId; } public void setUserId(Long userId) {  this.userId = userId; } }

    OrderService类

    package  placeholder; /** * @author Anders.Lin * */ public   interface  OrderService  public void ship(Order order);}

    Main类

    package  placeholder; import  java.util.Date; /** * @author Anders.Lin * */ public   class  Main  {  private OrderService orderService;  public void ship(Order order){  orderService.ship(order); } /**  * @param args  */ public static void main(String[] args) {  Order order = new Order("Anders007"new Date(), new Long(1));  Main main = new Main();  main.ship(order); }}

    OrderServiceAspect

    package  placeholder; /** * @author Anders.Lin * */ public  aspect OrderServiceAspect  { pointcut ship(): call(void OrderService.ship(..));  void around(Order order) : ship() && args(order){  System.out.println("ship "+ order.getOrderCode() + " sucess!"); }}

    虽然AspectJ的功能如此强大, 接口真正做占位符用的情况,估计还是有很多人提出异议,这样做我有什么好处,和我写接口实现类相比?好处目前,我能想的到的只有两个1. 模型上,强迫所有人思考——接口到底做什么,而不是怎么做2. 语言上,更加动态性,不在依赖接口的完整签名,只是输入参数和输出参数,看上去更接近.Net的Delegate

    技术好坏只有自己展控了才知道,AspectJ提供这样一个选择,怎么做还是自己琢磨着吧。


    最新回复(0)