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

一、静态代理

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

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

接口:

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. REDIS安装与配置

    1. mkdir /home/redis/ 2. mkdir /home/redis/conf 3. mkdir /home/redis/data 4. cd /home 5. 下载redis版本3. ...

  2. MyBatis通用Mapper开发

    通常情况下,MyBatis 的增删改查操作需要自己在相应xml中写相关语句, 但是运用相关工具,其实可以很方便的自动生成单表的所有增删改查(通用的多表联合查询还是需要自己写). 也可以根据具体环境,设 ...

  3. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  4. 对 Servlet 的改进--------Struts2 引入

    通过上一篇博客:Servlet 的详解 http://www.cnblogs.com/ysocean/p/6912191.html,我们大致知道了 Servlet 的基本用法.但是稍微分析一下 Ser ...

  5. UIDebuggingInformationOverlay在OC语法中使用

    转载请注明出处:http://www.cnblogs.com/pretty-guy/p/6924882.html 你可以从这里下载demo 在微博看到几位大牛再说将UIDebuggingInforma ...

  6. java中的一些规则(菜鸟的课堂笔记)

    ls 查看目录下文件 java规则 代码都定义在类中,用class定义 禁止一个源文件写两个类: 一个源文件中,只能有一个类文件是pubic: 一个源文件中如果有多个类,编译完之后会产生多个class ...

  7. vue-cli项目中怎么mock数据

    在vue项目中, mock数据可以使用 node 的 express模块搭建服务 1. 在根目录下创建 test 目录, 用来存放模拟的 json 数据, 在 test 目录下创建模拟的数据 data ...

  8. java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

    首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开 ...

  9. 【easyui】Tab的tools按钮刷新当前tab

    点击刷新按钮,刷新当前Tab选项卡 /** * Name 选项卡初始化 */ $('#home-tabs').tabs({ tools: [{ iconCls: 'icon-reload', bord ...

  10. C语言和go语言之间的交互

    一.go代码中使用C代码 go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import "C" 即可在go代码中使用C函数 代码示例: go代码:tes ...