二 代理模式【Proxy Pattern】 来自CBF4LIFE 的设计模式

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
先定义一种类型的女人:

package proxyPartern;

/**
 * @author lhb
 * @类名 IWoman
 * @描述  定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
 * @时间 2022/6/8 11:09
 * @版本
 **/
public interface IWoman {
    //抛媚眼
    public void makeEyessWithMan();
    //和男人快乐
    public void happyWithMan();
}

一种类型嘛,那肯定是接口,然后定义潘金莲: 

package proxyPartern;

/**
 * @author lhb
 * @类名 PanJinLian
 * @描述 定一个潘金莲是什么样的人
 * @时间 2022/6/8 11:13
 * @版本
 **/
public class PanJinLian implements  IWoman{

    @Override
    public void makeEyessWithMan() {
        System.out.println("pin jin lian  can make eyes to man!");
    }

    @Override
    public void happyWithMan() {
        System.out.println("pin jin lian  happy with man!");
    }
}

 

再定一个丑陋的王婆:  专门代理各种不安分的美眉

package proxyPartern;

/**
 * @author lhb
 * @类名 WangPo
 * @描述   王婆这个人老聪明了,她太老了,是个男人都看不上,   但是她有智慧有经验呀,她作为一类女人的代理!
 * @时间 2022/6/8 11:15
 * @版本
 **/
public class WangPo implements IWoman{

    private IWoman panJinLian;

    public WangPo(IWoman woman){
        this.panJinLian = woman;
    }

    @Override
    public void makeEyessWithMan() {
        //王婆这么大年龄了,谁看她抛媚眼?!
        this.panJinLian.makeEyessWithMan();
    }

    public IWoman getPanJinLian() {
        return panJinLian;
    }

    public void setPanJinLian(IWoman panJinLian) {
        this.panJinLian = panJinLian;
    }

    @Override
    public void happyWithMan() {
        //王婆这么大年纪了.干部了了.直接交给潘金莲吧.
        this.panJinLian.happyWithMan();
    }
}

两个女主角都上场了,男主角也该出现了: 西门庆开始召唤王婆......

package proxyPartern;

/**
 * @author lhb
 * @类名 XiMenQing
 * @描述 定义一个西门庆,这人色中饿鬼
 * @时间 2022/6/8 11:19
 * @版本
 **/
public class XiMenQing {

    /** 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
    *  被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
    *  收了不少好处费,那我们假设一下:
    *  如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
    */


    public static void main(String[] args) {
        //西门庆喊王婆出厂
        WangPo wangPo = new WangPo(new PanJinLian());
        //虽然王婆在做.其实是代理人在爽
        wangPo.makeEyessWithMan();
        wangPo.happyWithMan();
    }
}

王婆是个万能的代理人. 咱们再让他代理一个国际友人苍老师

先定义苍老师

 

package proxyPartern;

/**
 * @author lhb
 * @类名 CangLaoShi
 * @描述 苍老师 可是万能的.和谁都能happy.
 * @时间 2022/6/8 11:41
 * @版本
 **/
public class CangLaoShi implements IWoman{
    @Override
    public void makeEyessWithMan() {
        System.out.println("cang laoshi make some eyes to some body");
    }

    @Override
    public void happyWithMan() {
        System.out.println("cang laoshi make make happy wiht some body");
    }
}

 

西门庆又来召唤 王婆了.

package proxyPartern;

/**
 * @author lhb
 * @类名 XiMenQing
 * @描述 定义一个西门庆,这人色中饿鬼
 * @时间 2022/6/8 11:19
 * @版本
 **/
public class XiMenQing {

    /** 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
    *  被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
    *  收了不少好处费,那我们假设一下:
    *  如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
    */


    public static void main(String[] args) {
        //西门庆喊王婆出厂
        WangPo wangPo = new WangPo(new PanJinLian());
        //虽然王婆在做.其实是代理人在爽
        wangPo.makeEyessWithMan();
        wangPo.happyWithMan();
        //第二天 再次呼唤王婆 代理苍老师了. 前提西门庆知道王婆代理谁
        wangPo = new WangPo(new CangLaoShi());
        //虽然王婆在做.其实是代理的人苍老师在干活
        wangPo.makeEyessWithMan();
        wangPo.happyWithMan();
    }
}

 

说完这个故事,那额总结一下,代理模式主要使用了 Java 的多态,干活的是被代理类,代理类主要是
接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,
大家知根知底,你能做啥,我能做啥都清楚的很,同一个接口同一个接口同一个接口呗。


posted @ 2022-06-08 11:49  摇摆的时钟  阅读(71)  评论(0)    收藏  举报