美文网首页
Java设计模式——代理模式

Java设计模式——代理模式

作者: 132xin | 来源:发表于2020-09-07 16:30 被阅读0次

    静态代理

    介绍:

    给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。代理对象:起到中介作用,连接客户端和目标对象。
    通过引入代理对象的方式间接访问目标对象,从而防止直接访问目标对象给系统带来的复杂性。

    角色
    • 抽象对象(Subject):声明了真实对象和代理对象的公共接口。
    • 真实对象(RealSubject):代理对象所代表的真实对象,最终引用的对象。
    • 代理对象(Proxy):包含对真实对象的引用从而操作真实主题对象,想到于对真实对象进行了封装。
    特点

    优点

    协调调用者和被调用者,降低了系统的耦合度。
    代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用。

    缺点

    由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢。实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。

    实例
    public class ProxyTest {
        public static void main(String[] args) {
            //客户端调用
            Subject subject=new Proxy();
            subject.buyMac();
        }
    }
    /**
     * 因为小明想要买一台最新版的MAC电脑,但是国内买不了
     * 只能到美国买才有。
     * 现在需要你运用代码模式来实现:
     * 解决:
     * 代购(代理对象)代替我(真实对象)去购买(公共接口)电脑
     *
     */
    
    /**
     * 抽象对象
     * 声明了真实对象和代理对象的公共接口
     */
    interface Subject{
        void buyMac();
    }
    /**
     * 真实的对象
     *
     */
    class RealSubject implements Subject{
    
        @Override
        public void buyMac() {
            System.out.println("买一台Mac");
        }
        
    }
    class Proxy implements Subject{
    
        @Override
        public void buyMac() {
            //这里引用并创建对象实例
            RealSubject realSubject=new RealSubject();
            realSubject.buyMac();
            wrapMac();
        }
        /**
         *代理类的额外操作
         */
        public void wrapMac() {
            System.out.println("用盒子包装好Mac");
        }
        
    }
    
    

    动态代理

    介绍:

    因为静态代理只能服务1种类型的目标对象,若服务多种类型的目标对象,则需要为每种目标对象都实现一个静态代理对象。在目标对象较多的情况下,若采用静态代理,则会出现静态代理对象的数量越来越多,代码量大,这是可以采用动态代理的模式解决问题。
    动态代理其实是一种方便运行时候动态的处理代理方法的调用机制。

    模式原理

    设计动态代理类时,不需要显示实现与目标对象类相同的接口,而是将这种实现退出到程序运行时由JVM来实现。通过反射机制的method.invoke(),通过调用动态代理类对象方法,从而自动调用目标对象的方法。

    特点
    • 优点

    只需要1个动态代理类就可以解决创建对个静态代理的问题,避免重复,多余代码,具有更强的灵活性。

    • 缺点

    效率低:相对于静态代理中,直接调用目标对象方法,动态代理则需要先通过Java反射机制,从而间接调用目标对象的方法。

    具体的内容参考https://blog.csdn.net/qq_29966203/article/details/93377748

    相关文章

      网友评论

          本文标题:Java设计模式——代理模式

          本文链接:https://www.haomeiwen.com/subject/uaqlektx.html