今天要介绍的是一个Java中一个很重要的概念——代理

来源:互联网 发布:淘宝品牌库申请入口 编辑:程序博客网 时间:2024/06/05 14:59
今天要介绍的是一个Java中一个很重要的概念——代理。


  什么是代理?联系生活想想看,代理似乎并不陌生,最形象的代表便是经纪人,明星一般都有经纪人,经纪人作为中间人,负责代理明星的相关事宜,比如说,有人要请明星去唱歌表演,一般不会直接跟明星联系,而是联系他的经纪人,他的经纪人来负责安排行程,而真正唱歌表演的还是明星本人,经纪人仅仅作为一个附加物存在。


  在Java中,代理也是这样的概念,来看个栗子:


  先来创建一个明星类Stars:


复制代码
public class Stars implements IStars{
    private String name;


    public Stars(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public void sing(){
        System.out.println(getName() + " 唱了一首歌.");
    }


    public void dance(){
        System.out.println(getName() + " 跳了一支舞.");
    }
}
复制代码
  这是相应的接口:


public interface IStars {
    void sing();
    void dance();
}
  现在创建一个代理类:


复制代码
public class StarsProxy implements IStars{
    //保存接收的代理对象
    private IStars stars;


    public StarsProxy(IStars stars){
        this.stars = stars;
    }


    @Override
    public void sing() {
        System.out.println("我是代理,我收到了唱歌请求。");
        stars.sing();
        System.out.println("唱歌完毕");
    }


    @Override
    public void dance() {
        System.out.println("我是代理,我收到了跳舞请求。");
        stars.dance();
        System.out.println("跳舞完毕");
    }
}
复制代码
  来测试一下:


复制代码
public class Test {
    public static void main(String[] args){
        //创建目标对象
        IStars stars = new Stars("Frank");//代理对象,把目标传给代理对象,建立关系
        IStars starsProxy = new StarsProxy(stars);
        starsProxy.sing();
        starsProxy.dance();
    }
}
复制代码
  运行结果:


我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了跳舞请求。
Frank 跳了一支舞.
跳舞完毕
  我们可以看到,实际上代理类只是保存了Stars类的一个实例,因为实现的是相同的接口,StarsProxy类必须实现需要代理的Stars类的方法,比如这里的dance和sing,而这个接口正是链接两者的关键,因为实现接口就代表必定存在接口中声明的方法。


  那么,为什么要使用代理呢?


  其实主要目的是为了扩展原有类的功能,想想看,如果那个Stars类不是你写的,而是别人写的,现在要将原有的sing或者dance方法进行改造,比如需要统计唱歌和跳舞的次数,次数大于10则不进行该操作直接返回,这时候用代理就很好实现了,来把代理类稍作修改:


复制代码
public class StarsProxy implements IStars{
    //保存接收的代理对象
    private IStars stars;
    //保存sing和dance的次数
    private int num;


    public StarsProxy(IStars stars){
        this.stars = stars;
    }


    @Override
    public void sing(www.xucaizxyl.com ) {
        if (!ifWork()) {
            return;
        }
        System.out.println("我是代理,我收到了唱歌请求。");
        stars.sing();
        System.out.println("唱歌完毕");
    }


    @Override
    public void dance() {
        if (!ifWork(http://www.jyz521.com/ )) {
            return;
        }
        System.out.println("我是代理,我收到了跳舞请求。");
        stars.dance(http://feishenbo.cn/  );
        System.out.println("跳舞完毕");
    }


    /**
     * 是否继续工作
     * @return 是返回true,否则返回false
     */
    private boolean ifWork(){
        if (num > 3){
            System.out.println("明星今天已经很累了,明天再来吧。");
            return false;
        }else {
            num++;
            return true;
        }
    }
}
复制代码
  修改一下测试类:


复制代码
public class Test {
    public static void main(String[] args){
        //创建目标对象
        Stars stars = new Stars(www.feihuanyule.com/);
        stars.setName("Frank");


        //代理对象,把目标传给代理对象,建立关系
        StarsProxy starsProxy = new StarsProxy(stars);
        for (int i = 0;i < 5; i++){
            starsProxy.sing(www.huachengjpt.com  );
        }
    }
}
复制代码
  测试结果如下:


复制代码
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
明星今天已经很累了,明天再来吧。
复制代码
  看,简单粗暴。


  但其实并没有多少干货,这里仅仅是一种代理的思想,用这种思想可以比较方便的在不直接修改原有类的前提下对原有类的方法进行扩展。


  但是限制也显而易见:


  1.代理类需要跟被代理类实现相同的接口,这样才能一起向上转型后实现多态。


  2.当被代理的类需要进行的扩展增多时,管理会变得更加困难,之后对被代理类的修改,需要同时修改代理类,增加了修改成本。


  所以不要为了使用而使用,应用在合适的场景才能发挥它真正的作用。


  至此,本篇讲解完毕,欢迎大家继续关注!


真正重要的东西,用眼睛是看不见的。
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕妇能喝乌龙茶吗 台湾乌龙茶 乌龙茶多少钱一斤 乌龙茶和铁观音有什么区别 乌龙茶图片 乌龙茶的遐想 乌龙茶什么味道 乌龙减肥茶 鸟龙茶 乌龙茶是什么茶 铁观音是乌龙茶吗 黑乌龙茶的功效与作用 乌龙茶是绿茶吗 油切黑乌龙茶 乌龙茶是铁观音吗 乌龙茶的好处 乌龙茶是红茶吗 日本白桃乌龙茶 日本乌龙茶 立顿乌龙茶 乌龙茶和铁观音的区别 铁观音和乌龙茶的区别 乌龙茶和铁观音 铁观音 乌龙茶 乌龙茶多少钱 极边乌龙茶 乌龙茶茶叶 乌龙茶是红茶还是绿茶 红茶和乌龙茶的区别 绿茶红茶乌龙茶的区别 乌龙茶属于绿茶吗 乌龙茶属于红茶吗 乌龙茶和红茶的区别 乌龙茶属于红茶还是绿茶 乌龙茶减肥吗 乌龙茶有什么功效 乌龙茶减肥效果好吗 乌龙茶减肥成功30斤 乌龙茶可以减肥吗 乌龙茶都有哪些茶 乌龙茶加蜂蜜减肥法