Java设计模式--代理模式(Proxy)

概述


  • 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。
  • 定义:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
  • 为其他对象提供一种代理以控制对这个对象的访问。
  • 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
  • 在客户端和目标对象之间起到中介的作用,可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
  • 也叫委托模式
  • 代理模式是一种对象结构型模式。
  • 学习难度:★★★☆☆
  • 使用频率:★★★★☆

优缺点


  • 优点
    • 职责清晰:真实主题角色实现实际业务,利用代理完善其他的事情。
    • 封装性:对外只提供代理的角色功能。
  • 缺点

类图


在这里插入图片描述

组成角色


  • 抽象主题角色(Subject)
  • 真实主题角色(RealSubject)
  • 代理主题角色(Proxy)

code example


抽象主题角色(Subject)
  • 抽象主题角色定义好具体的功能
/**
 * 抽象主题角色:声明了真实主题和代理主题的共同接口。
 * 
 * @author yanbin
 * 
 */
public interface ITalk {

   public void talk(String msg);

}
真实主题角色(RealSubject)
  • 真实主题角色实现抽象主题角色,来提供功能实现
/**
 * 真实主题角色:定义真实的对象。
 * 
 * @author yanbin
 * 
 */
public class PeopleTalk implements ITalk {

   public String username;
   public String age;

   public PeopleTalk(String username, String age) {
      this.username = username;
      this.age = age;
   }

   public void talk(String msg) {
      System.out.println(msg + "!你好,我是" + username + ",我年龄是" + age);
   }

   public String getName() {
      return username;
   }

   public void setName(String name) {
      this.username = name;
   }

   public String getAge() {
      return age;
   }

   public void setAge(String age) {
      this.age = age;
   }

}
代理主题角色(Proxy)
  • 代理角色就是实现抽象主题角色,组合真实主题角色,将主题角色功能做转换,并可以附加其他逻辑
/**
 * 代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
 * 
 * @author yanbin
 * 
 */
public class PeopleTalkProxy implements ITalk {

   // 此处如果让客户端完全接触不到真是主题角色, 就应该在代理角色中就指定具体的代理哪个真是主题角色,而不是等待客户端指定。
   // 比如: private ITalk talker= new PeopleTalk("湖海散人", "18");
   private ITalk talker;

   public PeopleTalkProxy(ITalk talker) {
      this.talker = talker;
   }

   @Override
   public void talk(String msg) {
      talker.talk(msg);
   }

   public void talk(String msg, String singname) {
      talker.talk(msg);
      sing(singname);
   }

   private void sing(String singname) {
      System.out.println("唱歌:" + singname);
   }

}
客户端
/**
 * 代理模式:(Proxy Pattern 和 Surrogate Pattern):为其他对象提供一种代理以控制对这个对象的访问。
 * 8种代理模式:远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。
 * 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。<br>
 * 保护(Protect or Access)代理:控制对一个对象的访问权限。<br>
 * 智能引用(Smart Reference)代理:提供比对目标对象额外的服务。<br>
 * 组成:抽象主题角色;代理主题角色;真实主题角色。
 * 
 * @author yanbin
 * 
 */
public class ProxyPattern {

   public static void main(String[] args) {
      // 不需要执行额外方法的
      ITalk people = new PeopleTalk("湖海散人", "18");
      people.talk("No ProXY Test");
      System.out.println("-----------------------------");
      // 需要执行额外方法的
      PeopleTalkProxy talker = new PeopleTalkProxy(people);
      talker.talk("ProXY Test", "七里香");
   }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值