要么改变世界,要么适应世界

设计模式之静态代理

2020-05-10 09:17:00
111
目录

代理模式定义

代理模式又叫委托模式,为某一个对象提供一个代理对象,代理通过访问原对象,使得真正实施动作的是原对象。一个简单的例子就是:

一个厨师想要做饭的时候,他必须要有食材,做完饭之后需要清理厨具,但是对于厨师来说,他的任务就是做饭,其他的事情他不想插手,那么他就可以雇用一个帮手,为他做这些准备工作和处理工作。

代理模式一般可分为静态代理和动态代理:

  • 静态代理: 由程序员创建或工具生成代理类的源码,再编译代理类。 静态代理也就是意味着程序运行之前就已经自动生成代理类的字节码文件,代理类和委托类的关系就已经确认下来。
  • 动态代理: 动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,过程不会生成多余的字节码文件,代理类和委托类的关系在运行时期确认。

本文只讨论静态代理。

代码说明

package study.design.proxy;

public class StaticProxy {
    public static void main(String[] args) {
        Cook chef  = new Chef();
        Cook chefProxy = new ChefProxy(chef);
        chefProxy.cook();
    }
}
// 委托类和代理类都要实现该接口
interface Cook {
    void cook();
}

class Chef implements Cook {

    @Override
    public void cook() {
        // 具体的实际实现逻辑
        System.out.println("=======厨师做饭啦=======");
    }
}

class ChefProxy implements Cook {
    private Cook chef = null;

    // 默认代理自己
    public ChefProxy() {
        this.chef = new ChefProxy();
    }

    // 指明需要代理的对象
    public ChefProxy(Cook chef) {
        this.chef = chef;
    }

    @Override
    public void cook() {
        this.before();
        this.chef.cook();
        this.after();
    }

    // 预处理
    private void before() {
        System.out.println("=======食材准备完毕=======");
    }

    // 后处理
    private void after() {
        System.out.println("=======厨具清理完毕=======");
    }

}

控制台输出

=======食材准备完毕=======
=======厨师做饭啦=======
=======厨具清理完毕=======
  • 优点:委托类只关心具体的逻辑,无需浪费时间在其他无关事务上面;代理类还可以实现对委托类的管控,例如说上文的例子,假如某道菜厨师不会做或者不在行,帮手可以提醒或者直接拒绝厨师的行为,即根据对象的权限来进行实施动作。
  • 不足:
    • 需要代理的逻辑方法比较少的时候难度不大,假如方法非常多的时候,代码量就会非常多
    • 接口增加方法的时候,不仅仅委托类需要实现该方法,代理类也需要实现该方法,代码维护难度大。
历史评论
开始评论