• 大话设计模式读书笔记系列-4.代理模式


    >>>大话设计模式读书笔记系列目录>>>

    代理模式

    为其他对象提供一种代理以控制这个对象的访问.

    场景:

    通过"屌丝男士"委托"金牌代理"给校花"杨幂"送礼物的场景来了解代理模式

    被追求者(校花)
    /**
     * 被追求者(校花)
     */
    public class SchoolGirl {
        /**
         * 芳名
         */
        private String name;
    
       public SchoolGirl(String name)
       {
           this.name=name;
       }
    
        /**
         * 获取 芳名
         *
         * @return name 芳名
         */
        public String getName() {
            return this.name;
        }
    
        /**
         * 设置 芳名
         *
         * @param name 芳名
         */
        public void setName(String name) {
            this.name = name;
        }
    }
    送礼物接口
    /**
     * 送礼物接口
     */
    public interface GiveGift {
        /**
         * 送洋娃娃
         */
        void giveDolls();
        /**
         * 送花
         */
        void giveFlowers();
        /**
         * 送巧克力
         */
        void giveChocolate();
    }
    追求者类
    /**
     * 追求者类
     */
    public class Pursuit implements GiveGift {
    
        /**
         * 名字
         */
        private String name;
        /**
         * 心仪的校花MM
         */
        SchoolGirl schoolGirl;
    
        public Pursuit(String name) {
            this.name = name;
        }
    
        /**
         * 喜欢上一个MM
         *
         * @param schoolGirl
         */
        public void like(SchoolGirl schoolGirl) {
            this.schoolGirl = schoolGirl;
        }
    
        @Override
        public void giveDolls() {
    
            if (this.schoolGirl == null) {
                return;
            }
            System.out.println(this.name + " 送洋娃娃给 " + this.schoolGirl.getName());
        }
    
        @Override
        public void giveFlowers() {
            if (this.schoolGirl == null) {
                return;
            }
            System.out.println(this.name + " 送鲜花给 " + this.schoolGirl.getName());
        }
    
        @Override
        public void giveChocolate() {
            if (this.schoolGirl == null) {
                return;
            }
            System.out.println(this.name + " 送巧克力给 " + this.schoolGirl.getName());
        }
    }
    职业代理人
    /**
     * 职业代理人
     */
    public class ProxyMan implements GiveGift {
    
        /**
         * 委托人
         */
        private Pursuit pursuit;
    
        /**
         * 构造代理人
         * @param pursuit
         * @param schoolGirl
         */
        public ProxyMan(Pursuit pursuit, SchoolGirl schoolGirl) {
            //委托人
            this.pursuit = pursuit;
            //心仪女神
            this.pursuit.like(schoolGirl);
        }
    
        @Override
        public void giveDolls() {
            this.pursuit.giveDolls();
        }
    
        @Override
        public void giveFlowers() {
            this.pursuit.giveFlowers();
        }
    
        @Override
        public void giveChocolate() {
            this.pursuit.giveChocolate();
        }
    }

    调用

    public class ProxyDemo {
    
        public static void main(String[] args) {
            //校花杨幂
            SchoolGirl schoolGirl=new SchoolGirl("杨幂");
            //委托人
            Pursuit pursuit=new Pursuit("屌丝男士");
            //金牌代理人,接受 屌丝男士 追求 杨幂 任务
            ProxyMan proxyMan=new ProxyMan(pursuit,schoolGirl);
            //洋娃娃腐化
            proxyMan.giveDolls();
            //鲜花腐化
            proxyMan.giveFlowers();
            //巧克力腐化
            proxyMan.giveChocolate();
        }
    
    }

    结果

    屌丝男士 送洋娃娃给 杨幂
    屌丝男士 送鲜花给 杨幂
    屌丝男士 送巧克力给 杨幂

    解析

    1.远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实.

    2.虚拟代理,是根据需要创建开销很大的对象,通过他来存放实例化需要很长时间的真实对象.

    3.安全代理,用来控制真实对象访问时的权限.

    4.智能指引,是指当调用真实的对象时,代理处理另外一些事.

     

  • 相关阅读:
    取2个日期间的天数
    C#代码与JAVASCRIPT函数的相互调用
    ASP.NET验证码(3种)
    VS2008自带SQL 2005如何使用
    文本框默认有一个值,然后鼠标点上去那个值就清空
    远程桌面连接会话超时或者被限制改组策略也没用的时候就这么解决
    关于CComboBox的使用,编辑项的文字
    vc 剪切板 unicode
    Linux 防火墙、SELinux 的开启和关闭
    MSSQLSERVER服务不能启动
  • 原文地址:https://www.cnblogs.com/ff111/p/11314361.html
Copyright © 2020-2023  润新知