A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐进 中级黑马   /  2012-10-26 19:58  /  1158 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代理类是不是可以代理所有方法?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
getClass方法就不行,返回的还是目标类本身的字节码。
回复 使用道具 举报
代理类与被代理类,实现相同接口。可以代理接口的所有方法。
   代理模式[Proxy Pattern]
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢,就先找我的代理人吧.那代理人总要知道被代理人能做哪些事情不能做哪些事情吧.那就是两个人具备同一个借口,代理人虽然不能干活,但是被代理人能干活啊.
比如西门庆找潘金莲,那潘金莲不好意思答复呀.咋办,找那个王婆做代理,表现在程序上是这样的.
先定义一种类型的女人:
package proxyPattern;

public interface KindWomen {
    // I'm glad to share my knowledge with you all.
    // 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
    public void makeEyesWithMan();// 抛媚眼

    public void happyWithMan();// happy what?you know that!
}
一种类型嘛 ,那肯定是接口,然后定义潘金莲.
package proxyPattern;

//潘金莲是什么样的人

public class PanJinLian implements KindWomen {
    public void makeEyesWithMan() {
        System.out.println("潘金莲抛媚眼...");

    }
    public void happyWithMan() {
        System.out.println("潘金莲和男人做那个....");

    }
}
再定一个丑陋的王婆.
package proxyPattern;

//王婆这个人老聪明了,她太老了.是个男人都看不上,但是她有智慧有经验呀,她做为一类女人的代理!
public class WangPo implements KindWomen {
    private KindWomen kindWomen;

    // 默认的话,是潘金莲的代理
    public WangPo() {
        this.kindWomen = new PanJinLian();
    }

    // 她可以是KindWomen的任何一个女人的代理,只要你是这一类型
    public WangPo(KindWomen kindWomen) {
        this.kindWomen = kindWomen;
    }

    public void happyWithMan() {
        // 自己老了,干不了,可以让年轻的代替
        this.kindWomen.happyWithMan();

    }

    public void makeEyesWithMan() {
        // 这么大年龄了谁看她抛媚眼?!
        this.kindWomen.makeEyesWithMan();
    }
}
两个女主角都登场了.有请男主角:
package proxyPattern;

public class XiMenQing {

    /**
     * 水浒里这样写的,西门庆被潘金莲用竹竿敲了一下脑袋,痴迷了.
     * 被王婆看到了,就开始撮合两人的好事,王婆作为了潘金莲的代理人
     * 收了不少好处费,那我们假设一下:
     * 如果没有王婆在中间牵线,这两个不要脸的能成么?难说的很!
     */
    public static void main(String[] args) {
        // 先把王婆叫出来
        WangPo wangPo = new WangPo();
        //然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
        wangPo.makeEyesWithMan();
        //看到没,虽然表面上是王婆在做,实际上爽的是潘金莲.
        wangPo.happyWithMan();
    }
}
这就是活生生的一个例子,通过代理人实现了某种目的.如果去掉王婆这个中间环节直接是潘金莲和西门庆勾搭.估计很难成就武松杀嫂事件.
那我们再考虑一下,水浒里还有没有这类型的女人,有,卢俊义的老婆贾氏(就是和固管家苟合的那个)那名字起的:"假使",那我们也让王婆做她的代理.
把贾氏素描出来:
package proxyPattern;

public class JiaShi implements KindWomen {

    public void makeEyesWithMan() {
        System.out.println("贾氏抛媚眼...");
        
    }

    public void happyWithMan() {
        System.out.println("贾氏正在happy中...");        
    }

}
管家勾搭贾氏:
package proxyPattern;

public class GuanJia {

    public static void main(String[] args) {
        //管家勾搭贾氏.
        JiaShi jiaShi = new JiaShi();
        WangPo wangPo= new WangPo(jiaShi);//让王婆做为了贾氏的代理人
        
        wangPo.makeEyesWithMan();
        wangPo.happyWithMan();

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

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马