设计模式之代理模式

代理模式

代理模式说明:

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

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

 

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值