学习设计模式(六):代理模式

1.代理模式的介绍和设计思路

维基百科定义:代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。

著名的代理模式例子为引用计数(英语:reference counting)指针对象。当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。

2.代理模式的代码实现

1.静态代理

/**
 * 抽象接口
 * @author wtk
 */
public interface Subject {
    void visit();
}
/**
 * @program: DesignPatterns
 * @description: 实现类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class SubjectImpl implements Subject {
    private String msg = "realSubject";
    @Override
    public void visit() {
        System.out.println(msg);
    }
}
/**
 * @program: DesignPatterns
 * @description: 代理类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class ProxySubject implements Subject {
    private Subject subject;
    public ProxySubject(Subject subject){
        //得到实现类
        this.subject = subject;
    }
    @Override
    public void visit() {
        //访问实现类的visit的方法
        subject.visit();
    }
}
/**
 * @program: DesignPatterns
 * @description: 测试类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class ProxyMain {
    public static void main(String[] args){
        Subject subject = new ProxySubject(new SubjectImpl());
        subject.visit();
    }
}

静态代理的思路是代理类实现具体类的方法。但是如果代理类的需求变化,需要改变代理类的实现。

下面看一下动态代理

/**
 * 抽象接口
 * @author wtk
 */
public interface Subject {
    void visit();
}
/**
 * @program: DesignPatterns
 * @description: 实现类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class SubjectImpl implements Subject{
    private String msg = "realSubject";
    @Override
    public void visit() {
        System.out.println(msg);
    }
}
/**
 * @program: DesignPatterns
 * @description: 动态代理类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class DnamicProxySubject implements InvocationHandler {
    private Object object;

    public DnamicProxySubject(Object object){
        this.object = object;
    }
    public Object getDnamicProxy(){
        ClassLoader classLoader = object.getClass().getClassLoader();

        Object result = Proxy.newProxyInstance(classLoader,object.getClass().getInterfaces(),this);
        return result;
    }
    /**
    * @Description:
    * @Param: [proxy, method, args]
    * @return: java.lang.Object
    * @Author: Wtk
    * @Date: 2018/8/30
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object , args);
    }
}
/**
 * @program: DesignPatterns
 * @description: 动态代理测试类
 * @author: WangTengKe
 * @create: 2018-08-30
 **/
public class DnamicProxyMain {
    public static void main(String[] args){
        //目标对象
        Subject subject=  new SubjectImpl();
        //动态创建代理对象,将目标对象传入
        DnamicProxySubject dnamicProxySubject = new DnamicProxySubject(subject);
        Subject subject1 = (Subject) dnamicProxySubject.getDnamicProxy();
        //访问目标对象方法
        subject1.visit();
    }
}

源码地址:https://github.com/wangtengke/DesignPatterns
个人博客:https://blog.csdn.net/qq_22754377

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值