场景
场景1:
(1)买火车票不一定在火车站买,也可以去代售点。
(2)我们在本地(当地)不能去远程(火车站)去买火车票。
场景2:
(1)电商系统中支付中心中支付接口;物流中心的物流厂商接口,开发这些远程接口的代理类,代理类代理远程接口访问。
内容
1.代理模式
- 在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
1.1 类图
- 代理类和被代理类都是同一类型对象,所以实现同一个接口。
- 代理类由于需要代码被代理的类,所以我们需要在代理类里面依赖被代理类。
1.2 代码
public class ProxyPattern2 {
public static void main(String[] args) {
/**
* 代理模式一般有3个类:
* 主体、主体实现类、代理类;代理类和实体主体实现相同接口 类似于现实中 我们找人做代理需要找到合适的人
* 我们需要调用实体类的sell请求,但是我们自己不去调用,而是使用实体类的代理类去调用
*/
//1.创建被代理人
TrainSeller trainSeller = new TrainSeller();
//2.创建代理人
Proxy proxy = new Proxy(trainSeller);
proxy.sell();
}
public interface Seller{
void sell();
}
public static class TrainSeller implements Seller{
public void sell() {
System.out.println("出售火车票");
}
}
public static class Proxy implements Seller{
/**
* 代理类代理主体,肯定需要拿到主体
* 我们可以对代理类代理主体之前做一些额外事情
*/
private Seller seller;
public Proxy(Seller seller){
this.seller = seller;
}
public void sell() {
System.out.println("执行额外的条件判断,判断是否要调用Seller的sell()方法");
boolean result = true;
if(result){
seller.sell();
}
}
}
}
2.总结
优点:1、职责清晰。 2、高扩展性。 3、智能化。
缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。