更多设计模式举例
一、代理模式是什么?
代理模式可以类似于社交软件,双方之间的语言交流通过社交软件这个中间代理实现(追求者通过代理来送给被追求者礼物)
二、使用步骤
订单系统(使用代理模式完成,提交代码与UML类图)
一旦订单被创建,只有订单的创建人才可以修改订单中的数据,其他人则不能修改。
package zjj;
//代理借接口
interface OrderApi {
//产品名称 订购数量 订购人
public String getProductName();
public void setProductName(String productName,String user);
public int getOrderNum();
public void setOrderNum(int orderNum,String user);
public String getOrderUser();
public void setOrderUser(String orderUser,String user);
}
//创建人类
class Order implements OrderApi {
//产品名称 订购数量 订购人
private String productName;
private int orderNum;
private String orderUser;
public Order(String productName, int orderNum, String orderUser) {
//super();
this.productName = productName;
this.orderNum = orderNum;
this.orderUser = orderUser;
}
@Override
public String getProductName() {
return productName;
}
@Override
public void setProductName(String productName, String user) {
this.productName=productName;
}
@Override
public int getOrderNum() {
return orderNum;
}
@Override
public void setOrderNum(int orderNum, String user) {
this.orderNum=orderNum;
}
@Override
public String getOrderUser() {
return orderUser;
}
@Override
public void setOrderUser(String orderUser, String user) {
this.orderUser=orderUser;
}
}
//代理类
class OrderProxy implements OrderApi {
private Order order=null;
public OrderProxy(Order real) {
this.order = real;
}
@Override
public String getProductName() {
return this.order.getProductName();
}
//只有订购人的名字才可以更改订单名称
@Override
public void setProductName(String productName, String user) {
if(user!=null&&user.equals(this.getOrderUser())) {
order.setProductName(productName, user);
}
else {
System.out.println("对不起"+user+", 您无权修改订单中的产品名称");
}
}
@Override
public int getOrderNum() {
return this.order.getOrderNum();
}
//只有订购人的名字才可以更改订单数量
@Override
public void setOrderNum(int orderNum, String user) {
if(user!=null&&user.equals(this.getOrderUser())) {
order.setOrderNum(orderNum, user);
}
else {
System.out.println("对不起"+user+", 您无权修改订单中的订购数量");
}
}
@Override
public String getOrderUser() {
return this.order.getOrderUser();
}
//只有订购人的名字才可以更改订单人(订单人该自己的名字)
@Override
public void setOrderUser(String orderUser, String user) {
if(user!=null&&user.equals(this.getOrderUser())) {
order.setOrderUser(orderUser, user);
}
else {
System.out.println("对不起" +user+",您无权修改订单中的订购人");
}
}
//输出
public String toString() {
return "ProductName="+this.getProductName()+",orderNum="+
this. getOrderNum()+",orderUser="+this .getOrderUser();
}
}
public class kk {
public static void main(String[] args) {
// TODO Auto-generated method stub
OrderApi order=new OrderProxy(new Order("设计模式",99,"张三"));
order.setOrderNum(55, "李四");
System.out.println("李四修改后订单记录没有变化: "+order);
order.setOrderNum(55,"张三");
System.out.println("张三修改后,订单记录: "+order);
order.setOrderUser("王五", "张三");
System.out.println("张三修改后,订单记录: "+order);
}
}
总结
使用代理模式具有以下几个优点:
1、代理模式能将代理对象与真实被调用的目标对象分离。
2、一定程度上降低了系统的耦合度,扩展性好。
3、可以起到保护目标对象的作用。
4、可以对目标对象的功能增强。
当然,代理模式也是有缺点的:
1、代理模式会造成系统设计中类的数量增加。
2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
3、增加了系统的复杂度。