设计模式之代理模式(动态代理)

原创 2016年08月30日 19:05:48

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

简介

在上一篇已经大概讲解了代理模式,相信大家对代理模式有一定的了解了,如果没有

不妨先去看看上一篇 设计模式之代理模式(静态代理)

相信大家肯定有收获,如果有了一定的基础,那么在去看,相信理解会更加快,而且非常容易明白。

代码演示

因为上一篇已经比较详细的分析过了,所以直接上代码了

(1)定义代理接口

package com.zengtao.demo.proxy;

public interface IProxy {

    void buyTicket();

}

(2)动态代理

package com.zengtao.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 动态代理
 */
public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(obj, args);
    }

}

(3)具体代理买票

package com.zengtao.demo.proxy;

import com.zengtao.demo.bean.User;

/**
 * 具体代理买票
 */
public class RealProxy implements IProxy {

    private User user;

    public RealProxy() {

    }

    public RealProxy(User user) {
        this.user = user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public void buyTicket() {
        // 具体实现逻辑
        if (user != null) {
            System.out.println("***********我要买票***********");
            System.out.println("信息如下:");
            System.out.println("姓名:" + user.getName());
            System.out.println("性别:" + user.getSex());
            System.out.println("身份证号:" + user.getCardCode());
            System.out.println("住址:" + user.getHomeAddress());

            System.out.println("***********信息已核对***********");
            System.out.println("出票成功:动车D2222次09车20A");
        }
    }
}

(4)bean

package com.zengtao.demo.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable {

    private String cardCode;
    private String name;
    private String homeAddress;
    private String sex;

    public String getCardCode() {
        return cardCode;
    }

    public void setCardCode(String cardCode) {
        this.cardCode = cardCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

(5)具体调用

package com.zengtao.demo;

import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy;

public class Main {

    public static void main(String[] str) {
       // 用户信息
        User user = new User();
        user.setCardCode("510522177709096836");
        user.setSex("男");
        user.setName("无名氏");
        user.setHomeAddress("地球村第七号店铺");

        // 创建买票者
        IProxy zhangsan = new RealProxy(user);

        // 创建动态代理
        DynamicProxy proxy = new DynamicProxy(zhangsan);

        // 获取被代理的classloader
        ClassLoader loader = zhangsan.getClass().getClassLoader();

        // 动态构建一个代理站点
        IProxy iProxy = (IProxy) Proxy.newProxyInstance(loader, new Class[] { IProxy.class }, proxy);
        iProxy.buyTicket();
    }
}

(6)结果
这里写图片描述

结论

静态代理和动态代理,他们是从code的本质上去区分的,所以,这两种的区别也是从代码上的实现方式不同。

我们可以看到,在动态代理的实现实现了InvocationHandler这个接口,这个接口呢,也是Java自身给我们提供的一个便捷的动态代理接口,实现该接口,只需重写和调用其方法invoke就可以了

而我也在上一篇文章中说到动态代理模式是:通过反射机制动态的生成代理者的对象,我们在code阶段的时候,是不需要知道是谁代理谁,具体代理谁,我们会在执行的时候决定。

所以,我们使用object作为参数传入,并且在调用的时候,也是根据反射,获取代理类的classloader获取的,然后动态的构造代理,然后进行调用buyTicket()买票方法的

补充:

1、从code区分   

代理分为:静态代理和动态代理

2、适用范围

远程代理:对象在不同的内存地址空间提供局部代理,使得系统可以将Server部分实现隐藏

虚拟代理:对象在真正需要的时候创建,但是又十分消耗资源的时候

保护代理:使用代理控制对对象的访问权限

智能引用:访问对象时,加上一些自己的执行操作并对指向原始对象的引用计数

以上就是代理模式的基本知识点和实现方式。。。

版权声明:本文为博主原创文章,欢迎转载和分享,转载请标明出处!

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

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对...
  • yujin753
  • yujin753
  • 2015年06月26日 17:37
  • 2145

设计模式之动态代理(dynamic proxy)

1 动态代理与静态代理我们从上一篇设计模式之代理模式一文中已经知道,在代理模式中代理对象和被代理对象一般实现相同的接口,调用者与代理对象进行交互。代理的存在对于调用者来说是透明的,调用者看到的只是接口...
  • suifeng3051
  • suifeng3051
  • 2016年05月26日 15:16
  • 1873

Android设计模式之代理模式(Proxy Pattern)

代理模式介绍代理模式(Proxy Pattern)也称为委托模式,是结构型设计模式的一种,代理模式在各类开发中运用的相当广泛,不论是j2ee,android还是ios,都能看到它的身影,所以说设计模式...
  • happy_horse
  • happy_horse
  • 2016年05月31日 13:31
  • 1399

动态代理模式(设计模式10)

//处理器接口类:主要处理对真实角色的代理访问   客户执行结果: ···由结果可以看出,     只要执行代理类的方法,每次都进入处理器接口类中, 由此我们可以在处理器接口类中进行流程...
  • wuxintdrh
  • wuxintdrh
  • 2016年07月15日 19:12
  • 108

java设计模式—动态代理模式

类定义: 1、被代理接口和实现类:Tank类实现了Moveable接口,能够move() package com.zec.disignmode; public interface Moveabl...
  • aiqing0119
  • aiqing0119
  • 2012年07月05日 14:30
  • 355

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码。 先来回顾一下前5个模式: - Android开发中无处不在的设计模式——单例模式 - Android开发中无处不在的设...
  • sbsujjbcy
  • sbsujjbcy
  • 2016年01月21日 11:37
  • 7388

设计模式之 动态代理模式

设计模式之 动态代理模式 Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (1). Interface InvocationHandler:该...
  • u013017597
  • u013017597
  • 2014年01月21日 14:57
  • 349

【设计模式】动态代理模式

定义公有接口package com.test.dynamicProxy; public interface Output { public void Print(); } 定义被代理类stude...
  • ACmyth
  • ACmyth
  • 2013年07月31日 23:02
  • 217

使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程

/* * 接口中有几个方法,那么使用反射的getMethods()就会有几个方法名 * 因为接口是不会继承Object的 */ public interface Moveable { ...
  • a416090287
  • a416090287
  • 2012年07月27日 14:12
  • 1861

学习:java设计模式—动态代理模式

类定义: 1、被代理接口和实现类:Tank类实现了Moveable接口,能够move() package com.zec.disignmode; public interface Moveabl...
  • I_can_move_you
  • I_can_move_you
  • 2013年03月10日 21:24
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之代理模式(动态代理)
举报原因:
原因补充:

(最多只允许输入30个字)