代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
一、代理模式介绍
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
1、业务场景:水果店与第三方合作,开展了海外水果代购服务
2、时序图:代理模式 ---------一个类代表另一个类的功能。
二、测试代码结合前几篇博客:
1、创建订单接口:
/**
* 订单接口
*/
public interface OrderService {
int saveOrder();
}
2、本地订单实现类:
/**
* 本地订单
*/
public class OrderServiceImpl implements OrderService {
@Override
public int saveOrder() {
System.out.println("下单成功,订单号: 888888");
return 888888;
}
}
3、海外订单实现类:
/**
* 海外订单
*/
public class OutOrderServiceImpl implements OrderService {
@Override
public int saveOrder() {
System.out.println("下单成功,订单号: 66666666");
return 66666666;
}
}
4、代理类:
public class ProxyOrder implements OrderService {
//真实的订单服务
private OrderService orderService = new OutOrderServiceImpl();
@Override
public int saveOrder() {
System.out.println("开始海外下订单");
return orderService.saveOrder();
}
}
5、客户端测试代码:
/**
* 代理模式
* 代售进口水果
*/
public class ProxyClient {
public static void main(String[] args){
saveOrder();
}
public static void saveOrder(){
//本地代理类
OrderService orderService = new ProxyOrder();
orderService.saveOrder();
}
}
6、执行结果:
三、此时我们发现代理模式和装饰器模式很类似,如图:
两者都是当前对象无法胜任主功能,转给第三方对象来完成主功能。 装饰目标是增强自身(第三方是我内部),代理目标是找经纪人/甩锅(外部)
到此代理设计模式分析完毕,下篇我们分析常用的组合设计模式,敬请期待!