• 什么是代理模式:

Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

  • 代理模式的原型:

  • 代理模式的角色和职责:

subject(抽象主题角色): 真实主题与代理主题的共同接口。

RealSubject(真实主题角色):定义了代理角色所代表的真实对象。

Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象

  • 静态代理
package com.jason.proxy;public interface Sailor {public void sail();
}package com.jason.proxy;public class RealSailor implements Sailor {@Overridepublic void sail() {// TODO Auto-generated method stubSystem.out.println("sail");}}package com.jason.proxy;
/** 代理类通过持有Sailor的引用,但是有个性化的打折,以及优惠的功能*/
public class StaticSailProxy implements Sailor {private Sailor  sail;public Sailor getSail() {return sail;}public void setSail(Sailor sail) {this.sail = sail;}public void dazhe(){System.out.println("dazhe");}public void youhui(){System.out.println("youhui");}@Overridepublic void sail() {// TODO Auto-generated method stubthis.dazhe();this.getSail().sail();this.youhui();}}
  • 动态代理:

1. InvocationHandler 接口

2. invoke方法

3. Proxy.newProxyInstance();

package com.jason.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler {public Sailor  sail;public void setSail(Sailor sail) {this.sail = sail;}//拦截器方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubObject result=null;dazhe();//result=method.invoke(this.sail, args);youhui();return result;}public void dazhe(){System.out.println("dazhe");}public void youhui(){System.out.println("youhui");}}package com.jason.proxy;import java.lang.reflect.Proxy;public class TestMain {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSailor   sail=new RealSailor();
//        StaticSailProxy  proxy= new StaticSailProxy();
//        proxy.setSail(sail);
//        proxy.sail();//new StaticSailProxy().sail();DynamicProxy dynamic=new DynamicProxy();dynamic.setSail(sail);//创建动态代理,传入实际处理类的类加载器,实际处理类的所有接口方法,动态处理类;Sailor dynamicSailor=(Sailor)Proxy.newProxyInstance(RealSailor.class.getClassLoader(),sail.getClass().getInterfaces(),dynamic);//后台处理时,会触发动态处理类的invoke()方法dynamicSailor.sail();}}

23种java设计模式详解-代理模式相关推荐

  1. 常见的java设计模式详解

    常见的java设计模式详解 1. 根据目的来分 2 GoF的23种设计模式的功能 3.下面介绍几种常见的模式 单例(Singleton)模式 前言 1)单例(Singleton)模式的定义 2)特点 ...

  2. java 设计模式 之 几种常见设计模式详解 demo

    1.单例模式 单例模式,它的定义就是确保某一个类只有一个实例,并且提供一个全局访问点. 单例模式具备典型的3个特点:1.只有一个实例. 2.自我实例化. 3.提供全局访问点. 因此当系统中只需要一个实 ...

  3. 【设计模式自习室】详解代理模式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  4. Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异...

    本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...

  5. Java设计模式详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. Java 设计模式详解

    一.创建型模式 创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对独立地变换. 创建型模式包括: 工厂方法:Factory Method 抽象工厂:Abstra ...

  7. Java设计模式之虚拟代理模式

    描述: 虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成, ...

  8. ElasticSearch 23 种映射参数详解

    文章目录 1.ElasticSearch 映射参数 1.1 analyzer 1.2 search_analyzer 1.3 normalizer 1.4 boost 1.5 coerce 1.6 c ...

  9. JAVA 设计模式之《代理模式》

    文章目录 一.代理模式介绍 二.静态代理 三.jdk 动态代理 四.cglib 动态代理 五.总结 一.代理模式介绍 代理模式,非常容易理解,一眼看过去大家都懂,字面意思,如果不懂稍微琢磨琢磨就懂了, ...

最新文章

  1. Clojure语法学习-循环
  2. java+脚本+压枪,我的世界钓鱼脚本代码csgo压枪
  3. Windows 钩子的使用
  4. FZU - 2202 犯罪嫌疑人(逻辑思维+简单模拟)
  5. numpy 读取txt为array 一行搞定
  6. AspectJ 中的pointcut 语法
  7. 图像处理之积分图应用三(基于NCC快速相似度匹配算法)
  8. 异步与多线程的区别 线程安全 (总结)
  9. Spring Annotation是怎么工作的?
  10. 8086cpu学习笔记(4):指令系统
  11. JNI返回复杂对象之中的一个
  12. iZotope系列音频软件如何卸载
  13. keras小程序(一),用cnn做分类
  14. 系统清理软件测试,系统垃圾清理有用吗?六大清理工具评测
  15. Manjaro下安装和美化i3wm,以及相关软件配置
  16. 绿城中国的数字化转型之大中台实践
  17. 互联网医院远程医疗在线问诊药品商城处方流转系统源码spring boot+vue全开源
  18. openpose vs2015 cuda8.0 cudnn5.0 TiTan xp 环境配置
  19. 迅捷pdf转换器:如何将pdf转换成word
  20. Android跑指定包Monkey脚本

热门文章

  1. 导航系统设计专题(六)——松组合导航系统与紧组合导航系统
  2. AutoMapper小结
  3. Redis的Java客户端之Jedis(Jedis)
  4. leaflet maxZoom突破18
  5. 图片的放大ZommJS
  6. 服务器设计之SEDA架构
  7. 这个世界,总是被设计得刚刚好?人类或许只是被设定的一个程序
  8. Flutter实战开发(2)------实现条形码扫描获取商品信息
  9. 移动宽带没有公网IP?不,它有公网IPv6,你只需要……
  10. LocalDateTime获取服务器当前时间----24小时与12小时