zoukankan      html  css  js  c++  java
  • 设计模式-代理模式

    代理模式相对于其他的设计模式来说比较简单:什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理人可以。

    这里举个例子是模仿了《您的设计模式》中的经典案例,案例中讲述了一个小故事,就是西门庆、潘金莲、王婆之间的故事,水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费 ,那我们假设一下:如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!

    1、首先要定义一个接口,代理人和被代理人要同时具备这一个接口;

    package com.dongl.proxy;
    
    /**
     * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
     */
    public interface KindWomen {
    
        //这种类型的女人能做什么事情呢?
        public void makeEyesWithMan(); //抛媚眼
    
        public void talkWithMan(); //能够交谈
    }

    2、第二步:让代理人和被代理人同时实现这个接口,并且定义自己的方法;

    2.1、首先定义潘金莲属于可爱的女人可以和男生抛媚眼、交谈;

    package com.dongl.proxy;
    
    /**
     * 定一个潘金莲是什么样的人
     */
    public class PanJinLian implements KindWomen {
    
        @Override
        public void talkWithMan() {
            System.out.println("潘金莲 和男生交谈-------------");
        }
    
        @Override
        public void makeEyesWithMan() {
            System.out.println("潘金莲抛媚眼---------------------");
        }
    }

    2.2、定义一个贾氏也可以和男生抛媚眼、交谈;

    package com.dongl.proxy;
    
    /**
     * 定一个贾氏是什么样子的人
     */
    public class JiaShi implements KindWomen {
        @Override
        public void makeEyesWithMan() {
            System.out.println("贾氏 抛媚眼--------------");
        }
    
        @Override
        public void talkWithMan() {
            System.out.println("贾氏 和男生交谈-------------");
        }
    }

    2.3、王婆这个老狐狸知道自己长得又老又丑没有男人愿意和他触膝长谈,交流人生,但是她有智慧,他见多识广,认识很多女生,可以向男生保媒拉纤;

    package com.dongl.proxy;
    
    /**
     * 王婆这个人老聪明了,她太老了,是个男人都看不上,
     * 但是她有智慧有经验呀,她作为一类女人的代理!
     */
    public class WangPo implements KindWomen {
        private KindWomen kindWomen;
    
        public WangPo() {
            this.kindWomen = new PanJinLian();
        }
    
        public WangPo(KindWomen kindWomen) {
            this.kindWomen = kindWomen;
        }
    
    
        @Override
        public void makeEyesWithMan() {
            kindWomen.makeEyesWithMan();
        }
    
        @Override
        public void talkWithMan() {
            kindWomen.talkWithMan();
        }
    }

    第三步:男主登场,这时奶油小生西门庆来了,被潘金莲用竹竿打了一下,好像是迷上了潘小姐,这一幕恰巧被王婆看见了,然后以代理人的角色出现了,适当收点代理费,把这两个不要脸的戳合在一起了,然后就有了西门庆和潘金莲的交流人生:

    package com.dongl.proxy;
    
    /**
     * 定义一个西门庆  这人  喜欢和女生交流心得体会
     * 经常和潘金莲触膝长谈 你侬我侬的样子可真叫人羡慕
     */
    public class XiMenQing{
        /**
         * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
         * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
         * 收了不少好处费,那我们假设一下:
         * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
         */
        public static void main(String[] args) {
            WangPo wangPo = new WangPo();
            wangPo.talkWithMan();
            wangPo.makeEyesWithMan();
    
            /**如果西门庆不单单想和潘金莲成为好朋友 还想和贾氏成为好朋友
             * 这时西门庆又找到了王婆 说:我想和贾氏成为朋友 王婆肯定又收取了一大笔中介费
             * 这时可以调用王婆的有参构造
             */
            WangPo wangPo1 = new WangPo(new JiaShi());
            wangPo1.makeEyesWithMan();
            wangPo1.talkWithMan();
        }
    }

    到这里代理模式就介绍完了,虽然例子有点污,但是还是很容易理解的。

  • 相关阅读:
    MySQL 行锁 表锁机制
    2017年总结-我的学习之路
    SpringData 基于SpringBoot快速入门
    SolrJ 复杂查询 高亮显示
    Solr7 安装部署 管理界面介绍
    Redis 高可用集群
    10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
    1分钟解决VS每次运行都显示“正在还原nuget程序包”问题
    C# Lambda表达式和linq表达式 之 匿名对象查询接收
    C#枚举的简单使用
  • 原文地址:https://www.cnblogs.com/dongl961230/p/13299483.html
Copyright © 2011-2022 走看看