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

一、静态代理

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

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

接口:

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. Ionic进行PC端Web开发时通过脚本压缩提高第一次加载效率

    1. 问题 1.1. 问题上下文描述: 基于Ionic进行PC端的Web应用开发: 使用Tomcat作为最终服务发布容器. 1.2. 问题描述: 编译后main.js的大小为4-6MByte.(集成第 ...

  2. AngularJS语法基础及数据绑定——详解各种数据绑定指令、属性应用

    AngularJS简单易学,但是功能强大.特别是在构建单页面应用方面效果显著.而 数据绑定 可以说是他被广泛使用的最主要的优点.他舍弃了对DOM的操作方式,一切都由AngularJS来自动更新视图,我 ...

  3. 化繁为简(三)—探索Mapreduce简要原理与实践

    目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapreduce.演示Mapreduce例子程序 ...

  4. Java之枚举

    1.定义 enum 是一种数据类型,与 全局常量比较相似,都是全局的并且是可以通过类名调用的 与全局常量区别 枚举功能更强大,可以有属性和方法 枚举比全局常量更加的规范 2.枚举特性 1)可以有属性以 ...

  5. Java经典编程题50道之二十六

    请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. public class Example26 {    public static void main(Stri ...

  6. vs2015未安装 Style 的 Visual Studio 语言支持

    解决方案:在浏览器搜索下载安装Microsoft ASP.NET and Web Tools即可 下载地址:https://www.microsoft.com/en-us/download/confi ...

  7. Android上解析Json格式数据

    package com.practice.json; import org.json.JSONArray; import org.json.JSONException; import org.json ...

  8. Dubbo源码分析系列---服务的发布

    摘要: 通过解析配置文件,将xml定义的Bean解析并实例化,(涉及重要的类:ServiceBean.RegistryConfig[注册中心配置].ProtocolConfig[协议配置].Appli ...

  9. django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...

  10. docker 内部组件结构 -- docker daemon, container,runC

    Docker, Containerd, RunC : 从 Docker 1.11 开始, docker 容器运行已经不是简单地通过 Docker Daemon 来启动, 而是集成了Container, ...