Java之 代理模式(Proxy)(五)

2014-11-24 07:48:24 · 作者: · 浏览: 4
对象实例,那么就需要控制外部对它的访问,满足条件的可以访问,而不满足条件的就不能访问了。

2:示例实现

(1)订单对象的接口定义

要实现这个功能需要,先来定义订单对象的接口,很简单,主要是对订单对象的属性的getter/setter方法,示例代码如下:

/**

* 订单对象的接口定义

*/

public interface OrderApi {

/**

* 获取订单订购的产品名称

* @return 订单订购的产品名称

*/

public String getProductName();

/**

* 设置订单订购的产品名称

* @param productName 订单订购的产品名称

* @param user 操作人员

*/

public void setProductName(String productName,String user);

/**

* 获取订单订购的数量

* @return 订单订购的数量

*/

public int getOrderNum();

/**

* 设置订单订购的数量

* @param orderNum 订单订购的数量

* @param user 操作人员

*/

public void setOrderNum(int orderNum,String user);

/**

* 获取创建订单的人员

* @return 创建订单的人员

*/

public String getOrderUser();

/**

* 设置创建订单的人员

* @param orderUser 创建订单的人员

* @param user 操作人员

*/

public void setOrderUser(String orderUser,String user);

}

(2)订单对象

接下来定义订单对象,原本订单对象需要描述的属性很多,为了简单,只描述三个就好了,示例代码如下:

/**

* 订单对象

*/

public class Order implements OrderApi{

/**

* 订单订购的产品名称

*/

private String productName;

/**

* 订单订购的数量

*/

private int orderNum;

/**

* 创建订单的人员

*/

private String orderUser;

/**

* 构造方法,传入构建需要的数据

* @param productName 订单订购的产品名称

* @param orderNum 订单订购的数量

* @param orderUser 创建订单的人员

*/

public Order(String productName,int orderNum,String orderUser){

this.productName = productName;

this.orderNum = orderNum;

this.orderUser = orderUser;

}

public String getProductName() {

return productName;

}

public void setProductName(String productName,String user) {

this.productName = productName;

}

public int getOrderNum() {

return orderNum;

}

public void setOrderNum(int orderNum,String user) {

this.orderNum = orderNum;

}

public String getOrderUser() {

return orderUser;

}

public void setOrderUser(String orderUser,String user) {

this.orderUser = orderUser;

}

}

(3)订单对象的代理

创建好了订单对象,需要创建对它的代理对象了。既然订单代理就相当于一个订单,那么最自然的方式就是让订单代理跟订单对象实现一样的接口;要控制对订单setter方法的访问,那么就需要在代理的方法里面进行权限判断,有权限就调用订单对象的方法,没有权限就提示错误并返回。示例代码如下:

/**

* 订单的代理对象

*/

public class OrderProxy implements OrderApi{

/**

* 持有被代理的具体的目标对象

*/

private Order order=null;

/**

* 构造方法,传入被代理的具体的目标对象

* @param realSubject 被代理的具体的目标对象

*/

public OrderProxy(Order realSubject){

this.order = realSubject;

}

public void setProductName(String productName,String user) {

//控制访问权限,只有创建订单的人员才能够修改

if(user!=null && user.equals(this.getOrderUser())){

order.setProductName(productName, user);

}else{

System.out.println("对不起"+user

+",您无权修改订单中的产品名称。");

}

}

public void setOrderNum(int orderNum,String user) {

//控制访问权限,只有创建订单的人员才能够修改

if(user!=null && user.equals(this.getOrderUser())){

order.setOrderNum(orderNum, user);

}else{

System.out.println("对不起"+user

+",您无权修改订单中的订购数量。");

}

}

public void setOrderUser(String orderUser,String user) {

//控制访问权限,只有创建订单的人员才能够修改

if(user!=null && user.equals(this.getOrderUser())){

order.setOrderUser(orderUser, user);

}else{

System.out.println("对不起"+user

+",您无权修改订单中的订购人。");

}

}

public int getOrderNum() {

return this.order.getOrderNum();

}

public String getOrderUser() {

return this.order.getOrderUser();

}

public String getProductName() {

return this.order.getProductName();

}

public String toString(){

return "productName="+this.getProductName()+",orderNum="

+this.getOrderNum()+",orderUser="+this.getOrderUser();

}

}

(4)测试代码

一起来看看如何使用刚刚完成的订单代理,示例代码如下:

public class Client {

public static void main(String[] args) {

//张三先登录系统创建了一个订单

OrderApi order = new OrderProxy(

new Order("设计模式",100,"张三"));

//李四想要来修改,那就会报错

order.setOrderNum(123, "李四");

//输出order

Sy