定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

一、静态代理

静态代理说白了就是把原先直接调用被代理类的方法放到代理类来调用,同时

我们可以在代理类额外的添加一些操作。

接口:

package com.proxy.example;

public interface Employ {

    void work();

}

实现:

package com.proxy.example;

public class Engineer implements Employ {

    @Override
public void work() {
System.out.println("写代码。。。"); } }

代理:

package com.proxy.example;

public class StaticProxy implements Employ {

    private Employ employ;

    public StaticProxy(Employ employ) {
super();
this.employ = employ;
} @Override
public void work() {
punchCard();
employ.work();
getfforkunch();
} private void punchCard(){
System.out.println("上班打卡。。。");
} private void getfforkunch(){
System.out.println("下班打卡。。。");
} }

测试:

package com.proxy.example;

public class TestStaticProxy {

    public static void main(String[] args) {
StaticProxy proxy = new StaticProxy(new Engineer());
proxy.work(); } }

二、jdk动态代理

从前面的静态代理可以看出,我们可以使用代理添加一些额外的操作,但是如果我有

许多不同的接口的实现类要代理,那么就要写很多不同的静态代理类,因此动态代理就孕育而生了。

在添加一个被代理的类:

接口:

package com.proxy.example.dynamic;

public interface Manager {

    void analysis();

}

实现:

package com.proxy.example.dynamic;

public class DemandManager implements Manager {

    @Override
public void analysis() {
System.out.println("分析需求。。。");
} }

创建代理的类:

package com.proxy.example.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) {
this.target = target;
} /**
* proxy:  指代我们所代理的那个对象
* method:  指代的是我们所要调用真实对象的某个方法的Method对象
* args:   指代的是调用真实对象某个方法时接受的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
punchCard();
Object result = method.invoke(target, args);
getfforkunch();
return result;
} private void punchCard(){
System.out.println("上班打卡。。。");
} private void getfforkunch(){
System.out.println("下班打卡。。。");
} /**
* 通过Proxy类的newProxyInstance方法来创建我们的代理类对象,三个参数含义:
* 第一个参数target.getClass().getClassLoader() ,我们这里使用被代理对象target这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数target.getClass().getInterfaces(),我们这里为代理对象提供的接口是被代理对象所实现的接口,这样我们生成的代理对象的方法就有我们被代理的对象的方法了
* 第三个参数this, 指当前的代理对象
*/
public Object getProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} }

测试:

package com.proxy.example.dynamic;

import com.proxy.example.Employ;
import com.proxy.example.Engineer; public class TestDynamicProxy { public static void main(String[] args) {
Engineer engineer = new Engineer();
DynamicProxy engineerProxy = new DynamicProxy(engineer);
Employ employEngineer = (Employ)engineerProxy.getProxy();
employEngineer.work(); Manager manager = new DemandManager();
DynamicProxy managerProxy = new DynamicProxy(manager);
Manager demandManager = (Manager)managerProxy.getProxy();
demandManager.analysis(); } }

如果按照静态代理就要再写一个代理类,但是动态代理就可以和它的名字一样进行动态的生成代理类。

设计模式 - 代理模式(jdk)的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  4. 代理模式-JDK Proxy(Java实现)

    代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. Array ...

  5. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  6. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  7. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

  8. 设计模式——代理模式(静态代理和JDK、CGLib动态代理)

    简介 什么是代理模式? 代理模式就是多一个代理类出来,代替原对象进行一些操作.比如说租房的中介.打官司的律师.旅行社,他们可以代替我们做一些事情,这就是代理. 代理模式的应用场景: 如果已有的方法在使 ...

  9. linkin大话设计模式--代理模式

    代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端并不关心是否可以准确的得到这个对象,他只要一个能够提供该功能的对象而已,此时我们就可以返回该对象的代理.总而言之,客户端 ...

  10. Java设计模式の代理模式

    目录  代理模式 1.1.静态代理   1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...

随机推荐

  1. BAYESIAN STATISTICS AND CLINICAL TRIAL CONCLUSIONS: WHY THE OPTIMSE STUDY SHOULD BE CONSIDERED POSITIVE(转)

    Statistical approaches to randomised controlled trial analysis The statistical approach used in the ...

  2. css实现梯形(各种形状)的网页布局——transform的妙用

    在各式各样的网页中,经常会看到形状特别的布局,比如说下面的这种排版方式: 这种视觉上的效果,体验十分好.那么他是如何来实现的呢,博主在这里整理了如下2种实现的方式. 1.通过给 div 加border ...

  3. day5_ 导入模块和包

    ######################模块导入模块做的事1.产生新的名称空间2.以新建的名称空间为全局名称空间,执行文件的代码3.拿到一个模块名spam,指向spam.py产生的名称空间 imp ...

  4. 使用nodeJS实现前端项目自动化之项目构建和文件合并

    前面的话 一般地,我们使用构建工具来完成项目的自动化操作.本文主要介绍如何使用nodeJS来实现简单的项目结构构建和文件合并 项目构建 假设,最终实现的项目名称为'test',结构如下图所示 那么,首 ...

  5. 排序算法 - 选择排序(selection sort)

    选择排序(Selection sort)跟插入排序一样,也是O(n^2)的复杂度,这个排序方式也可以用我们的扑克牌来解释. 概念 桌面上有一堆牌,也是杂乱无章的,现在我们想将牌由小到大排序,如果使用选 ...

  6. 使用Azure Policy(策略)强制实现资源Tag的坑

    Azure的Tag(标记)可以帮助运维人员对云资源分类从而方便地进行计费和资源管理.然而在具体实践中工程师部署云资源的时候常常会忘记给资源做标记打Tag. 针对这个问题,Azure的官方文档建议是可以 ...

  7. H5拖拽 构造拖拽及缩放 pdf展示

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

  8. Android的UI调优

    对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿. 在理想情况下,全部的测量.布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性. ...

  9. GIS与水文分析(1)GIS与水文学

    GIS与水文分析(1)GIS与水文学 对于大部分GIS从业人员或者利用GIS作为研究方向的人员来说,水文学过于专业,更偏重于理论化,很难从GIS的角度来模拟和分析水文的过程.这其实是个普遍性的问题,任 ...

  10. JS 事件派发器EventDispatcher

    在Java和AS中经常用到EventDispatcher,写了一个JS版本的. addListener :添加事件监听器 removeListener:移除事件监听器 dispatchEvent:派发 ...