代理模式三大要素:抽象角色(真实角色和代理角色关系),代理角色(中间人),真实角色(供应方)
一、静态代理
package org.mars.design.proxy.staticMode;
/**
* Title: base<br>
* Description: It's an abstract role,just like a deal between the proxy role and real role.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 6:10:23 PM <br>
* @author wangmeng
*/
public abstract class AbstractRole {
/***
* An action, just like a request.
*/
abstract void response();
}
---------------------------------------------------------------
package org.mars.design.proxy.staticMode;
/**
* Title: base<br>
* Description: It's a proxy role.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 6:30:00 PM <br>
* @author wangmeng
*/
public class ProxyRole extends AbstractRole{
/**
* Members who need agent.
*/
private RealRole realRole;
public ProxyRole(){}
/**
* It's a action of proxy's own, just a member method.
*/
private void declare(){
System.out.println("If you want build a family, just tell me, since I'm a matchmaker.");
}
@Override
void response() {
if(null == realRole){
realRole = new RealRole();
}
this.declare();
//Deal the handler of the real role.
realRole.response();
}
}
-------------------------------------------------------------
package org.mars.design.proxy.staticMode;
/**
* Title: base<br>
* Description: It's a real role.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 6:31:58 PM <br>
* @author wangmeng
*/
public class RealRole extends AbstractRole{
@Override
void response() {
System.out.println("When a man loves me forever, I will get married with him.");
}
}
------------------------------------------------
需求方样例:
package org.mars.design.proxy.staticMode;
/**
* Title: base<br>
* Description: It's demander, which maybe need something to be solved with someone's help.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 6:43:39 PM <br>
* @author wangmeng
*/
public class Demander {
public static void main(String[] args){
AbstractRole role = new ProxyRole();
/**
* Coming up with a demand.
*/
System.out.println("I want to marry a girl and build a warm family with her.");
/**
* Let agent do it.
*/
role.response();
}
}
二、动态代理
package org.mars.design.proxy.dynamicMode;
/**
* Title: base<br>
* Description: In the dynamic mode, the abstract role is a interface.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 7:21:35 PM <br>
* @author wangmeng
*/
public interface AbstractRole {
/**
* Actions need to be done.
*/
void response();
}
----------------------------------------------------------
关键点:动态代理动态调用
package org.mars.design.proxy.dynamicMode;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Title: base<br>
* Description: Dynamic Proxy.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 7:29:27 PM <br>
* @author wangmeng
*/
public class ProxyRole implements InvocationHandler{
/**
* The object which would be agent.
*/
private Object realRole;
public ProxyRole(){}
/**
* Rebuilding the constructor in order to pass the object into the dynamic agent.
* @param obj
*/
public ProxyRole(Object object){
this.realRole = object;
}
/**
* That'll invoked by the JVM automatically.
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
/**Other methods passed in can be here.*/
/**Do the method of the real role.*/
method.invoke(this.realRole, args);
/**Other methods passed in can be here too.*/
return null;
}
}
------------------------------------------------------------
package org.mars.design.proxy.dynamicMode;
/**
* Title: base<br>
* Description: It's also a real role.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 7:25:15 PM <br>
* @author wangmeng
*/
public class RealRole implements AbstractRole {
public void response() {
System.out.println("When a man loves me forever, I will get married with him.");
}
}
---------------------------------------------------------------------
需求方样例:
package org.mars.design.proxy.dynamicMode;
import java.lang.reflect.Proxy;
/**
* Title: base<br>
* Description: It's a demander.<br>
* Copyright: Copyright (c) 2011 <br>
* Create DateTime: Jun 24, 2011 8:00:05 PM <br>
* @author wangmeng
*/
public class Demander {
public static void main(String[] args){
RealRole realRole = new RealRole();
ProxyRole handler = new ProxyRole(realRole);
Class<?> cls = realRole.getClass();
AbstractRole role = (AbstractRole) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),handler);
role.response();
}
}
注意动态代理模式和静态代理的区别:原理一样,实现方式不同,动态代理模式关键在于动态代理根据类加载器和接口组来动态实现所传入对象的方法调用。
分享到:
相关推荐
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
JAVA设计模式之代理模式实例
代理模式.ppt代理模式.ppt代理模式.ppt
本程序是一个代理模式的小例子。程序比较简单。
设计模式-代理模式(讲解及其实现代码)
深信服网闸代理模式配置教程
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式
代理模式代理模式代理模式
自己总结的代理模式和Java中的动态代理模式,有源码
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的主要作用是,用来控制真实对象的访问权限,也就是完全对外隐藏真实对象。以及在调用真实对象时,代理还可以额外的处理另外的事。 比如下面...
代理模式的小demo
自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
该资源提供了三种代理模式的使用代码,其中包含每种模式的jar包、具体代码、Demo测试类,详细的注释帮助你来理解。
设计模式C++学习之代理模式(Proxy)
.net实现设计模式之代理模式