Java设计模式之代理模式

代理模式

什么是代理模式?

举个生活中的例子:代理商。我们生活中买的许多物品都是通过代理商那里购买的,比如旅行社,代理旅行、机票等业务,代理出口商品。代理商并不产生这些产品,他们是从厂家拿货,所以虽然是通过代理商那里买到了产品,实际物品还是属于厂家那里。代理商作为一种中间层,可以为消费者带来许多遍历,消费者不需要购买物品的时候跑到生产厂家。

再举个例子:老板与秘书。老板一般都很忙,如果一个客户相要见老板,打电话给老板,接电话的都是老板的秘书,然后由秘书再向老板转告,老板如果档期已满,则秘书直接告诉客户,今天无法见面。这里秘书也起到了一个代理的作用,秘书作为客户和老板之间的中间层,减轻了老板的工作量,或者阻挡了一些不想见的客户。

代理模式与上面两个例子基本类似。比如客户端和服务器端的通信(类比客户与老板间),代理作为中间层,当客户端请求服务器时,则会先经过代理,然后由代理去请求服务器,而此时客户端并不知道访问的是代理。这样的好处就是,减轻了服务器的压力,当请求大量资源,比如图片,或者服务器要处理很长时间时,通过代理就可以先返回一部分图片给客户端,而不是让用户一直等待。

代理可以控制对实际对象的访问。比如客户端向服务器端请求时,可能需要验证客户端的身份,那么代理就可以起这个作用,验证客户端的身份,控制客户端对服务器的请求。

代理模式的结构

  1. 抽象主题(Subject):它是一个接口,代理和实际主题(对象)要共同实现这个接口。
  2. 实际主题(类比服务器):实际主题就是代理要代理的对象,该对象实现了抽象主题。
  3. 代理(Proxy):代理是实现抽象主题的类,代理类中包含实际主题的一个引用,通过这个引用就可以控制对实际主题的访问,达到代理的目的。

代理模式UML类图

Java设计模式之代理模式_第1张图片

实现(客户老板例子)

//抽象接口,秘书和老板类都要实现这个接口,他们有共同的hearPhone方法
public interface Employee {
    public String hearPhone(String s)
}

//实际主题,老板类
public class Boss implements Employee {
@Override
public String hearPhone(String s) {
    if(s.contains("买")) {
        return "好的,我们约个时间谈谈";
    }else if(s.contains("吃饭")) {
        return "没问题";
    }else {
        return "不见";
    }
  }
}

//代理,秘书类
public class Secretary implements Employee{
Boss boss;
public Secretary() {
    boss = new Boss();
}
@Override
public String hearPhone(String s) {
        String back  = boss.hearPhone(s);
        return back;
    }
}

//测试类
public class ProxyDemo {

public static void main(String[] args) {
    Secretary secretary = new Secretary();
    String back = secretary.hearPhone("老张啊,一块吃饭吧");
    System.out.println(back);
    back = secretary.hearPhone("那个老张啊,那个钱什么时候换呢");
    System.out.println(back);
   }
}

//结果
没问题
不见

代理模式的优点

  1. 解耦:屏蔽用户真正请求的对象,使用户与真正对象之间解耦。
  2. 使用代理来担当那些创建耗时的对象的替身

代理模式的缺点

  1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
  2. 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理

代理的使用场景

  1. 不希望用户直接访问某个对象,可以使用代理作为中间层,控制对当前对象的访问。
  2. 一个对象需要很长的时间才能加载完成,比如大的图片。
  3. 当对象处于远程主机上,需要为用户提供访问该远程对象的能力。
  4. 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理
  5. 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可

你可能感兴趣的:(java,设计模式,代理,java设计模式,代理模式)