一、简介

  • 概念:
  • 代理模式:为对象提供一个替身或者代理,控制对该对象的访问。即通过代理对象去访问目标对象,这样可以动态扩展目标对象的功能。
  • 代理模式有三种模式:
  1. 静态代理
  2. 动态代理(JDK代理/接口代理)
  3. Cglib代理
  • 通用类图:

即客户端通过代理对象去访问目标对象,而不是直接访问目标对象,可以控制目标对象的访问。

本文先讲解一下静态代理模式的实现方法。

二、静态代理

【a】静态代理实现步骤:

需要定义一个接口或者抽象类,然后代理对象和被代理的对象都要实现这个接口或者继承这个抽象类。

示例:我们拿生活中找中介租房子的示例来说明静态代理的实现方式。

相关UML类图:

角色分析:

  • 抽象角色:声明了真实对象和代理对象共同的接口,往往是一个接口或者是抽象类,对应上图的抽象接口类DailyBehavior;
  • 代理角色:内部含有一个对被代理对象的引用,目的在于可以操作被代理对象,期间可以对被代理的对象功能进行扩展,实际上封装了被代理对象的功能,对应上图的LettingAgentProxy类;
  • 真实角色:其实就是被代理对象,对应上图中的房东类Landlord ;

详细代码如下:

【a】抽象接口:真实对象和代理对象共同的接口

public interface DailyBehavior {/*** 租房子*/void rentApartment();}

【b】房东类:被代理对象

public class Landlord implements DailyBehavior {@Overridepublic void rentApartment() {System.out.println("房东将房子租给我们...");}}

【c】代理中介类:持有一个被代理对象的引用

public class LettingAgentProxy implements DailyBehavior {/*** 持有一个被代理对象的引用*/private Landlord landlord;public LettingAgentProxy(Landlord landlord) {this.landlord = landlord;}@Overridepublic void rentApartment() {this.prev();landlord.rentApartment();}private void prev() {System.out.println("中介帮忙找房东...");}}

【d】客户端:也就是租客自己

public class Client {public static void main(String[] args) {//我们只与中介打交道,实际上出租房子的还是房东DailyBehavior proxy = new LettingAgentProxy(new Landlord());proxy.rentApartment();}
}

【e】运行结果

如上所示,我们客户端直接面对的是代理角色,让代理角色去跟真实角色打交道,实际操作还是由真实角色去完成,期间可以扩展真实角色的功能,进行一些额外的处理来增强。

三、总结

  • 优点:
  • 在不改变目标对象功能的前提下,可以扩展其功能;
  • 缺点:
  • 因为代理类Proxy需要与被代理类实现相同的接口或者继承相同的父类,这就会产生大量的代理类;
  • 如果抽象接口新增了方法,那么代理类和被代理类都要修改,违反了开闭原则,维护相对困难;

设计模式 ( 十二 ) 静态代理模式相关推荐

  1. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  2. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  3. 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)

    静态代理: 角色分析: 抽象角色:一般使用接口或者是抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 以一个租房子的例子来 ...

  4. 【专题系列】搞定设计模式之—— 十二 :代理模式

    点击上方"java大数据修炼之道",选择"设为星标" 优质文章, 第一时间送达 来源 | https://www.cnblogs.com/three-fight ...

  5. GoF设计模式(十二) - 享元模式

    前言 享元模式(Flyweight Pattern)运用共享技术有效地支持大量细粒度的对象,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的 ...

  6. 大话设计模式十二:访问者模式

    一.模式定义 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式是一种对象行为型模式. ...

  7. 大话设计模式十二:门面模式(牛市股票也会亏钱)

    Client客户端只和Facade打交道,而Facade方法中封装了多个其他复杂方法. 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,从而使得客户端不需要 ...

  8. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  9. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  10. 设计模式之静态代理模式实战

    转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...

最新文章

  1. pytorch 获取模型参数_剑指TensorFlow,PyTorch Hub官方模型库一行代码复现主流模型...
  2. android之Fragment(官网资料翻译)二
  3. LeetCode 9 回文数
  4. C++bead sort珠排序的实现算法(附完整源码)
  5. 前端 <table><td><tr><th>
  6. 哪个银行的大额存款门槛最低?5万能买大额存单吗?
  7. java用户注册代码解析_java springmvc 注册中央调度器代码解析
  8. SecureCRT打开文件中文乱码
  9. droid sans字体_2019年免费可商用字体大全(附打包下载)
  10. 优酷爱奇艺回应被处罚;拼多多主体公司法定代表人变更,黄峥退出董事席位;斗鱼发布开源框架Jupiter | 极客头条
  11. 单机多实例Tomcat部署
  12. springmvc application/octet-stream 问题
  13. C4认证Java基础Excel练习题
  14. 常见的Ajax写法汇总
  15. 高数基础_第1节_概述以及预备知识
  16. Android蓝牙配对
  17. 边缘检测-Canny
  18. 有向加权图 最大弱连通分支_指数基金介绍专栏:指数基金的加权方式,你都知道哪些?...
  19. 【性能测试】Jmeter性能测试实战
  20. 经验:怎么样免费在线PDF拆分

热门文章

  1. android kill process,为什么Application有时会在killProcess上重启?
  2. 多项式拟合,模型的复杂度以及权重的变化
  3. 算法:二分法求平方根Sqrt(x)
  4. 237.删除链表中的节点
  5. 矩阵论10,11,12作业
  6. linux opendir路径_Linux C/C++ ----目录文件的操作(opendir,readdir,closedir)
  7. 用python语言提取千位数_C语言怎样提取一个数的十位个位百位千位?
  8. DFS应用(拓扑排序和强连通分支)
  9. pc微信登录扫码显示无法连接服务器,WeAuth微信小程序实现PC网站扫码授权登录...
  10. mysql编码utf8改为g_修改MySQL的编码为UTF8