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

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

  hot3.png

代理模式:

组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

举例:现实生活里,大家租房可能需要通过中介公司(代理类),联系房屋出租者(真实类),我们是自己无法直接联系的,那么这其实就是一个典型的代理模式。中介公司在整个过程中,可能会有加钱,签署合同之类的附加动作。

代码举例:

中介公司就是一个代理,那么它其实有着约定好的协议。

可以是抽象类,也可以是接口。

public interface IAbstractObj {	public void doSomeThings();}

然后房屋出租者和我们自己都要遵守协定接口,那么不管是真实的类,还是代理类,都应该继承该接口,同时代理类应该持有被代理类的对象,完成代理的过程。

public class ProxyObject implements IAbstractObj {	RealObject realObject = new RealObject();	@Override	public void doSomeThings() {		realObject.doSomeThings();	}}
public class RealObject implements IAbstractObj {	@Override	public void doSomeThings() {		System.out.println("真实对象");	}}
这样就是通过代理类把代理对象和调用者分开了。调用者不直接调用真实对象,而是通过代理对象间接调用。

public class Test {	public static void main(String[] args) {		IAbstractObj obj = new ProxyObject();		obj.doSomeThings();	}}
以上为静态代理,缺陷很明显,当代理类增多,重复代码会很多,硬代码实现不太好,以下介绍动态代理示例。

------------------------------------------分割线--------------------------------------------------------

动态代理

修改代理类

动态代理类需要实现InvocationHandler接口,重写invoke方法

proxy:被代理对象

method:代理方法

args:方法的参数

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyObject implements InvocationHandler {	private Object target;	public Object bind(Object target) {		this.target = target;		return Proxy.newProxyInstance(target.getClass().getClassLoader(),				target.getClass().getInterfaces(), this);	}	@Override	public Object invoke(Object proxy, Method method, Object[] args)			throws Throwable {		Object result = null;		result = method.invoke(target, args);		return result;	}}
客户端程序修改

import com.ufgov.impl.ProxyObject;import com.ufgov.impl.RealObject;public class Test {	public static void main(String[] args) {		ProxyObject proxy = new ProxyObject();		IAbstractObj bind = (IAbstractObj) proxy.bind(new RealObject());		bind.doSomeThings();	}}

转载于:https://my.oschina.net/gm945/blog/469458

你可能感兴趣的文章
安装JDK和配置环境变量
查看>>
behavior planning——10 behaior planning pseudocode
查看>>
C# 正则表达式大全
查看>>
jquery获取radio选中的值或者select做出判断事件
查看>>
STL——queue
查看>>
说一下函数重载和覆盖的区别
查看>>
C++关键字--volatile
查看>>
MySQL学习【第十篇存储引擎实际应用】
查看>>
IIS 8.0 Using ASP.NET 3.5 and ASP.NET 4.5微软官方安装指导
查看>>
navicat for mysql下载地址
查看>>
OBject-c 输出时的占位符
查看>>
九宫格数独--回溯法
查看>>
要获得“机器学习或数据科学”的工作,到底选哪种编程语言更好?
查看>>
教程视频、项目源码、全部干货【微信小程序、React Native、Java、iOS、数据结构】...
查看>>
iOS 如何根据经纬度来定位位置
查看>>
删除难以删除的文件
查看>>
Windows下编译SDL
查看>>
pytorch梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm
查看>>
Android--onMeasure()和onLayout()
查看>>
第一周 从C走进C++ 004 引用
查看>>