论坛首页 Java企业应用论坛

Interface plays as Placeholder, without any class implement

浏览 2872 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-09  

Interface play as Placeholder, without any class implement it
Author: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提供这样一个选择,怎么做还是自己琢磨着吧。

   发表时间:2007-02-10  
//1. 模型上,强迫所有人思考——接口到底做什么,而不是怎么做
感觉实际是让代码变得复杂来做到这一点(OrderServiceAspect 做了OrderServiceImpl的事,没觉得把子类放在impl包或通过第三方包实现要好)
//2. 语言上,更加动态性,不在依赖接口的完整签名
用IOC便实现了动态性,用aspect原则上也是依赖于aspect实现的啊
"不依赖接口的完整签名"我不明白,是不是不依赖具体类命名的意思?
0 请登录后投票
   发表时间:2007-02-10  
//1. 模型上,强迫所有人思考——接口到底做什么,而不是怎么做
感觉实际是让代码变得复杂来做到这一点(OrderServiceAspect 做了OrderServiceImpl的事,没觉得把子类放在impl包或通过第三方包实现要好)

如果一定要从代码上看,并没有变的复杂。

//2. 语言上,更加动态性,不在依赖接口的完整签名
用IOC便实现了动态性,用aspect原则上也是依赖于aspect实现的啊
"不依赖接口的完整签名"我不明白,是不是不依赖具体类命名的意思?

是的,不需要方法名,输入参数类型上约束
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics