博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-代理模式(Proxy)
阅读量:6277 次
发布时间:2019-06-22

本文共 2549 字,大约阅读时间需要 8 分钟。

  hot3.png

AbstractObject.java

 
package cn.foxeye.design.proxy; public abstract class AbstractObject { abstract void eat(); }

RealObject.java

 
package cn.foxeye.design.proxy; public class RealObject extends AbstractObject { @Override void eat() { System.out.println( " 对象执行吃的操作 " ); } }

ProxyObject.java

 
package cn.foxeye.design.proxy; public class ProxyObject extends AbstractObject { private RealObject object; public ProxyObject(RealObject object) { this .object = object; } @Override public void eat() { before(); object.eat(); after(); } public void before() { System.out.println( " 做法 " ); } public void after() { System.out.println( " 刷锅 " ); } }

采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。

按照代理类的创建时期,可以分为:静态代理和动态代理。

静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。

动态代理: 在程序运行时,通过反射机制动态生成代理类。代理类需要实现InvocationHandler接口。

Service.java

 
package cn.foxeye.design.dynamic.proxy; public interface Service { public String getName(); public int total( int a, int b); }

ServiceImpl.java

 
package cn.foxeye.design.dynamic.proxy; public class ServiceImpl implements Service { private String name; public ServiceImpl(String name) { this .name = name; } public String getName() { return this .name; } @Override public int total( int a, int b) { return a + b; } public boolean isOwner() { if ( " admin " .equals( this .name)) { return true ; } else { return false ; } } }

ProxyService.java

 
package cn.foxeye.design.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyService implements InvocationHandler{ private Object target; public ProxyService(Object target) { this .target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object resultObject = null ; if ( ! (target instanceof ServiceImpl)) { System.out.println( " 不能代理该对象 " ); return resultObject; } resultObject = method.invoke(target, args); return resultObject; } public Object getProxyInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this ); } }

Main.java

 
package cn.foxeye.design.dynamic.proxy; public class Main { public static void main(String[] args) { Service target = new ServiceImpl( " admin " ); ProxyService proxyService = new ProxyService(target); Service service = (Service)proxyService.getProxyInstance(); System.out.println(service.total( 2010 , 203 )); } }

转载于:https://my.oschina.net/foxeye/blog/142937

你可能感兴趣的文章
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
PyCairo指南--目录
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
Linux/centos 下挂载硬盘的 方法
查看>>
数据库
查看>>
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>
DICOM医学图像处理:WEB PACS初谈
查看>>
maven assembly plugin使用
查看>>
5: Calling Programs(Working with programs)
查看>>
QML学习笔记-入门篇(2)
查看>>
H3C设备网络组建和设置
查看>>
windows上一样使用linux命令--xshell登陆cygwin
查看>>
Linux查看系统配置常用命令
查看>>
大端 VS 小端
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
虚拟机克隆之后无法正确获取静态ip
查看>>
Java 连接Kafka报错java.nio.channels.ClosedChannelExcep
查看>>
字符设备驱动程序——poll机制介绍
查看>>
Markdown使用
查看>>