Java设计模式之 * 模式实例分析
作者:aronykl 发布时间:2022-07-07 17:55:07
本文实例讲述了Java设计模式之 * 模式。分享给大家供大家参考,具体如下:
前面介绍了静态代理模式, * 比静态代理模式更加强大。它能在程序运行时动态的生成代理对象。所谓 * 类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则 * 类就宣称它实现了这些interface。当然, * 类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
* 的角色和静态代理的角色一样:
① 抽象角色:真实对象和代理对象的共同接口。其中声明真实对象和代理对象需要做的事。
② 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
③ * 角色:需要实现InvocationHandler接口,并且实现其中的invoke方法。 * 觉得持有一个Object类型引用,这个表示需要 * 的角色。定义为Object类型,表示可 * 任何类型的对象。
以下给出一个简单的 * 模式的简单的代码实例:
1. 抽象角色:真实对象和代理对象的共同接口。其中声明真实对象和代理对象需要做的事。
package com.tydic.dynamicproxy;
public interface Subject {
public void request();
}
2. 真实角色:需要实现抽象角色,是被代理的对象。
package com.tydic.dynamicproxy;
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("from real subject!");
}
}
3. * 角色:需要实现InvocationHandler接口,并重写接口里面的invoke方法public Object invoke(Object proxy, Method method, Object[] args)
。invoke方法有三个参数。参数proxy指代理类,method表示被代理的方法,args为method中的参数数组,返回值Object为代理实例的方法调用返回的值。这个抽象方法在代理类中动态实现。
package com.tydic.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicSubject implements InvocationHandler {
private Object sub;//被代理的对象
public DynamicSubject(Object obj) {
this.sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling:" + method);
//可以在被代理的方法前后添加功能
method.invoke(sub, args);
System.out.println("after calling:" + method);
return null;
}
}
4. 编写客户端代码:需要用到一个Proxy类。Proxy类所有 * 类的父类,提供用于创建 * 类和实例的静态方法。Proxy类有一个静态方法public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
。第一个参数表示 * 类的类加载器,第二个是 * 类应该要实现的接口的Class数组,第三个参数是InvocationHandler 对象,当 * 调用需要代理的方法时,InvocationHandler 对象的invoke方法会得到调用。
package com.tydic.dynamicproxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Subject subject = new RealSubject();
DynamicSubject handle = new DynamicSubject(subject);
//动态的生成代理对象
Subject sub = (Subject) Proxy.newProxyInstance(DynamicSubject.class.getClassLoader(), subject.getClass().getInterfaces(), handle);
sub.request();//实际是handle的invoke方法得到了调用
}
}
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/zw19910924/article/details/45228125


猜你喜欢
- 人每天都要喝8杯水才能保持健康,于是苦逼的程序员总是一遍代码就忘了时间,于是我突发奇想能不能开发一个apk能够实现固定的间隔时间定时提醒我要
- 一、闭包的定义。有很多不同的人都对闭包过进行了定义,这里收集了一些。# 是引用了自由变量的函数。这个函数通常被定义在另一个外部函数中,并且引
- 开门见山,添加水印的方法非常简单,其实就只有3个步骤:1、载入原始图片2、载入水印图片3、保存带有水印的图片实现的原理就是:获取原始图片的宽
- 俄罗斯方块Tetris是一款很经典的益智游戏,之前就做了一款桌面版的java俄罗斯方块,这次就尝试着写了一款适用于Android平台的俄罗斯
- 数组的长度是固定的,无法适应数据变化的需求。为了解决这个问题,Java提供了另一个容器 java.util.ArrayList集合类,让我们
- 本文分享了c#操作Excel的相关代码,还是比较全面的,其实无外乎存取,增删改查等操作,参考下。具体代码://引用Microsoft.Off
- 最近有个需求 要求列表 滑动后第一条 需要和顶部对齐上网找了找 发现 官方支持 Recycle + LinearSna
- 注:如果没有 root 权限也是可以试试,一般情况下,都需要 root 权限,才能连接成功。1.需要确保你的开发 PC 和 Android
- Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见《详解Android中Intent的使用方法》。如
- 关于Windows10 Java环境变量配置问题的解决办法由于最近有一些时间,所以想要把之前学过一段时间的Java重新捡起来看看,之前的学习
- Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅
- 1. selectKey标签查询DDLCREATE TABLE `luck_reward_info` ( `id` int NO
- 先来个效果图觉得不好看可以自己调整1.绘制数据点线状图一般由数据点和连线组成在绘制连线之前,我们先标出数据点这里我选择用Image图片来绘制
- Java 从Set里面取出有序的记录详解及实例Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSe
- 1.Bean 的创建生命周期UserService.class —> 无参构造方法(推断构造方法) &md
- 目录前言整合swagger api自定义配置信息简单使用Swagger常用注解Api标记ApiOperation标记ApiParam标记Ap
- 使用idea创建javaweb项目idea还是写框架项目比较爽,原生的javaweb项目不是特别方便,这篇文章就是记录一下创建的过程图较多注
- 本文实例讲述了Android权限操作之uses-permission。分享给大家供大家参考,具体如下:我们在安装Android软件的时候,系
- 前言Compose的动画Api用起来很简单,效果看起来很神奇,那么它内部到底是如何运转的呢?使用动画的代码示例:var isOffset b
- jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息jmap -heap 19560出现以