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

一、静态代理

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

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

接口:

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. 根据源码用HttpServletRequest获取MultipartFile的问题

    问题 由于某些原因,现在需要这样的一个文件上传接口,这个接口type(String)是必传参数,photoFile(MultipartFile)是非必传参数,即一般情况下需要接受两个参数,分别为pho ...

  2. ionic 使用mobisscrolls,实现日期选择的插件

    废话不多说,直接说用法: 1,先下载mobisscrolls的破解版,下载地址,链接:http://pan.baidu.com/s/1boSKf51 密码:5dft 当然你也可以去官网下载,不过官网的 ...

  3. 傻瓜式安装nginx以及负载均衡配置

    概述 需求 做了一个对内的http api应用.由于只有一台服务器,考虑到升级问题(即升级时会造成几秒钟用户访问不了),决定搭一个nginx,公共端口:9999,部署2套应用,端口:9981,9982 ...

  4. [HDU1000] A + B Problem

    Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...

  5. NodeMCU入门(2):在线构建、刷入固件,上传代码

    准备工作 1.NodeMCU模块 2.ESP8266Flasher.exe 3.ESPlorer v0.2.0-rc6 构建固件 Building the firmware提供了三种构建你自己固件的方 ...

  6. 解决其他浏览器没有propertychange事件

    监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...

  7. Chapter2:Discrete-Time Signal Processing and Short-Time Fourier Analysis

    作者:桂. 时间:2017-05-24  08:44:53 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 这一 ...

  8. [codeforces631E]Product Sum

    E. Product Sum time limit per test: 1 second memory limit per test: 256 megabytes input:standard inp ...

  9. hadoop伪分布式集群搭建与安装(ubuntu系统)

    1:Vmware虚拟软件里面安装好Ubuntu操作系统之后使用ifconfig命令查看一下ip; 2:使用Xsheel软件远程链接自己的虚拟机,方便操作.输入自己ubuntu操作系统的账号密码之后就链 ...

  10. angularjs下拉框实现渲染html

    angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击.但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框,代码如下: <body ng-app=& ...