• [一天一个设计模式]-[代理模式]


    代理模式的设计思想是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象.

    代理又分为静态代理、动态代理。

    1. 静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
    2. 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。当有一组不同的主题的控制访问一致,如果用静态代理就需要为每个主题创建一个代理类,很多访问控制的冗余代码,动态代理就可以很好的解决这个问题。

    代理模式的主要角色如下。

    1. 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
    2. 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
    3. 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

    代理模式和适配器模式区别,适配器模式是要改变类型,代理模式保持类型不变

    代理模式和装饰器模式区别,装饰器模式是为了增强现有对象,代理模式是为了控制现有对象

    举个栗子,买车票不去自己去火车站,而是通过黄牛。

    静态代理
    interface Buy{
        void buy();
    }
    
    class LiLi implements Buy{
        @Overrride
        public void buy(){
            sout("buy LiLi's [==]");
        }
    }
    
    //黄牛代理 LiLi
    class YellowCow implement Buy{
        Buy buy;
        public YellowCow(Buy buy){
            buy = buy;
        }
        
        @Override
        public void buy(){
            if( buy instanceof LiLi){
                buy.buy();
            }
        }
    }
    
    动态代理
    class YellowCow implements InvocationHandler {
        Object buy;
        public YellowCow(Object buy){
            buy = buy;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
            if( buy instanceof LiLi){
                return method.invoke(buy, args);
            }
            return null;
        }
    }
    
    main(){
        //静态代理
        Buy y=new YellowCow(new LiLi());
        y.buy();
        
        //动态代理
        Buy y=Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Buy.class},new YellowCow(new LiLi()));
        y.buy();
    }
    
  • 相关阅读:
    使用 lntelliJ IDEA 创建 Maven 工程的springboot项目
    HTTP协议小记
    TCP/UDP的网络底层实现
    TCP的三次握手和四次挥手
    IP地址和MAC地址绑定的必要性
    什么是回调函数?
    基于TCP实现的Socket通讯详解
    HTTP协议随笔
    计算机虚拟世界的入门常识(1)——信号的原理
    UDP比TCP好用的优势
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026934.html
Copyright © 2020-2023  润新知