对象结构型

介绍

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

代理模式的应用

远程代理:屏蔽对象存在于不同空间的事实;如webservice是一门跨平台的技术,假设使用.net写的服务比java使用,那么就会生成一个java端的代理来供java代码使用
虚拟代理:存放创建资源开销大的对象;如Hibernate中的load方法的懒加载
安全代理:通过代理对象代理真是对象,从而控制真是对象的权限
智能指引:当调用真实对象时,代理处理另外一些事情;如第一次引用持久化对象,会将其存到内存中

参考自书籍《大话设计模式》

入门案例:

代码:
Home:

public interface Home {
    void get(String packageName);
}

XiaoMing:

public class XiaoMing implements Home {

    @Override
    public void get(String packageName) {
    System.out.println("接收:" + packageName);
    }
}

MaMa:

public class MaMa implements Home {

    private XiaoMing xiaoming;

    {
        this.xiaoming = new XiaoMing();
    }

    @Override
    public void get(String packageName) {
        System.out.println("妈妈代理小明接收包裹");
        xiaoming.get(packageName);
        System.out.println("妈妈代理小明接收完包裹了");
    }
}

测试:

public class Main {
    public static void main(String[] args){

        /**
         * 模拟场景:
         *    小明在网上买了个女朋友,当天送到,但同时小明今天又约了朋友小强去网吧玩地下城
         *    因为妈妈也是这个家的成员,所以傻乎乎的快递员就同意让妈妈签收了
         *    这时,妈妈就充当代理(proxy)这个角色,来去代替小明接收这个网购的女朋友,然后交给小明
         */

        String packageName = "女朋友";

        MaMa maMa = new MaMa();
        maMa.get(packageName);

        /**
         * output:
         *  妈妈代理小明接收包裹
         *  接收:女朋友
         *  妈妈代理小明接收完包裹了
         */
    }
}
原文地址:https://www.cnblogs.com/tandi19960505/p/8164277.html