设计模式之代理模式

来源:互联网 发布:恐怖黎明官网数据库 编辑:程序博客网 时间:2024/06/07 01:02

代理模式

代理模式说明:

代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

 

1.      静态代理模式

UML图如下所示:

    

具体代码如下所示:

 

 package com.dai.proxy.staticproxy1;/** * @author 戴礼明 *日期: 2016-6-4 *content: 接口 */public interface Subject {    public void subjectProp();} package com.dai.proxy.staticproxy1;/** * * @author 戴礼明 *日期: 2016-6-4 *content:物品 */public class RealSubject implements Subject{    public RealSubject() ;    }    public void subjectProp() {        System.out.println("我是真实的商品!");    }}package com.dai.proxy.staticproxy1;/** * @author 戴礼明 *日期: 2016-6-4 *content:代理subject类 */public class ProxySubject implements Subject{    private RealSubject subject;    public ProxySubject() {       subject=new RealSubject();    }    public void subjectProp() {       System.out.println("我代理了真实的商品!");        subject.subjectProp();    }}package com.dai.proxy.staticproxy1;/** * * @author 戴礼明 *日期: 2016-6-4 *content:静态代理测试 */public class TestProxy {    public static void main(String[] args) {       new ProxySubject().subjectProp();    }}

 

2.    动态代理

UML图如下所示:

代码如下所示:

package com.dai.proxy.dynamicproxy1;/** * @author 戴礼明 *日期: 2016-4-17 *content: */  public interface Subject {    public void subjectProp();}package com.dai.proxy.dynamicproxy1;/** * * @author 戴礼明 *日期: 2016-4-17 *content: */public class RealSubject implements Subject{    public void subjectProp() {        System.out.println("我是真实的产品!");    }}package com.dai.proxy.dynamicproxy1;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * @author 戴礼明 *日期: 2016-4-17 *content:  */public class SubjectProxyHandler implements InvocationHandler{      private Object proxied;     public SubjectProxyHandler(Object proxied) {        this.proxied=proxied;    }    public Object invoke(Object proxy, Method method, Object[] args)           throws Throwable {       System.out.println(method.getName());       System.out.println("我是代理产品!");        method.invoke(proxied, args);        return null;    }} package com.dai.proxy.dynamicproxy1;import java.lang.reflect.Proxy;/** * @author 戴礼明 *日期: 2016-4-17 *content:动态代理类 */public class DynamicProxy {    public static void main(String[] args) {         RealSubject realSubject=new RealSubject();         SubjectProxyHandler handler=new SubjectProxyHandler(realSubject);        Subject subject=(Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class},handler);        subject.subjectProp();    }}


 

 

0 0
原创粉丝点击