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 |