到网上找这个模式的例子,不知为何,突然觉得这个和之前写的装饰器模式特别像
感觉都做了一件:方法增强!
代理模式:为其他对象提供一种代理以控制对这个对象的访问.
这里要理解【控制】为何物,又是如何做到控制的。
代理模式有以下角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
Example:用代理实现一个场景,十二运召开了,一票难求,不得已,有许多代理售票点。
用代理模式实现【这个例子合适吗 ?】
1. 抽象角色
/** * 抽象角色 : 售票窗接口 * * @author king * */ public interface IWicket { //主要功能是售票 void sell(); }
2.真实角色
/** * 真实角色:售票窗 * * @author king */ public class Wicket implements IWicket{ @Override public void sell() { System.out.println("给一张十二运的票...."); } }
3.代理角色
/** * * 代理角色 * * @author king * */ public class ProxyWicket implements IWicket { private IWicket wicket; /** * 代理类调用被代理类的方法 */ @Override public void sell() { if(null == wicket){ wicket = new Wicket();//被代理的对象 } System.out.println("HY来到代理点买十二运人的票"); wicket.sell(); } }
4. 运行类
public class Main { public static void main(String[] args) { //没被代理之前 IWicket wicket = new Wicket(); System.out.println("去窗口买票....."); wicket.sell(); System.out.println("----------------------"); //被代理之后 System.out.println("去代理点买票....."); IWicket proxywicket = new ProxyWicket(); proxywicket.sell(); } }
运行结果:
去窗口买票.....
给一张十二运的票....
----------------------
去代理点买票.....
HY来到代理点买十二运人的票
给一张十二运的票....
想到了什么,java的动态代理是不是?
JDK动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
example:先实现一个登陆校验功能,但是当它被代理的时候,在校验的前后要插入日志
1.业务逻辑接口
/** * 业务逻辑接口 * * @author king * */ public interface ILoginService { //对应的业务方法 void login(); }
2. 实现类
/** * 实现类 * * @author king * */ public class LoginService implements ILoginService{ //验证用户名,实现登陆功能 @Override public void login() { System.out.println("校验用户名和密码..."); } }
3..日志方法
/** * * 日志类 * * @author king * */ public class LogUtil { //方法被执行之前调用 public static void before(String method){ System.out.println("before call: "+ method); } //方法被执行后调用 public static void after(String method){ System.out.println("after call: "+method); } }
4.动态代理类
/** * 动态代理,实现日志插入功能 * * @author king * */ 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 { //方法执行前 LogUtil.before(target.getClass().getName()+"."+method.getName()); Object obj = method.invoke(target, args); //方法执行后 LogUtil.before(target.getClass().getName()+"."+method.getName()); return obj; } }
5. 运行类:
public class Main { public static void main(String[] args) { ILoginService target = new LoginService(); ProxyService handler = new ProxyService(target); ILoginService proxy = (ILoginService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), handler); proxy.login(); } }
运行结果:
before call: designpattern.jdk.proxy.LoginService.login
校验用户名和密码...
before call: designpattern.jdk.proxy.LoginService.login
本人菜鸟HY大神的一阳神指
参考文档 <http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924> ,此处致谢
相关推荐
【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1
设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...
6. **代理模式**:为了安全控制薪资数据的访问,可以使用代理模式,例如创建一个薪资服务代理,处理权限验证和事务管理。 7. **职责链模式**:在审批薪资流程中,不同的角色可能有不同的审批权限。职责链模式可以让...
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
**设计模式之代理模式** 代理模式是软件设计模式中的一种结构型模式,它在对象交互过程中引入一个代理,代理对象负责控制对原对象的访问。这种模式的主要目的是为了解耦,提供一种替代真实对象的方式,使得客户端...
代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和...
代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。通过引入代理,我们可以增加新的功能,如缓存、日志记录、访问控制等...
单体模式是JavaScript中最基本的设计模式之一。它的主要作用是提供一个命名空间,减少全局变量的数量,避免代码冲突,并组织代码使其易于维护。单体模式可以用来划分命名空间,组织代码和避免代码冲突。 2. 工厂...
11. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。 12. **责任链模式**:将请求封装为一个对象,并将接收者链接成链。请求沿着链传递,直到被处理。 13. **命令模式**:将请求封装为一个对象,...
在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...
31.设计模式之代理模式 32.设计模式之观察者模式 33.设计模式之策略模式 34.设计模式之命令模式 35.设计模式之迭代器模式 36.设计模式之中介者模式 37.设计模式之享元模式 38.设计模式之职责链模式 39.设计模式之...
代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...
### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...
代理模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在.NET框架下。代理模式的核心思想是为一个对象提供一个替代品或代表,这个替代品能够控制对原对象的访问,使得客户端代码可以通过代理对象与...
设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...