设计模式笔记之九 (装饰者模式)

装饰者模式

装饰者模式就是动态的给一个对象额外的添加一些职责或者说方法,接口。

我们还是到实际的应用中来理解这个模式。

前段时候,我们实验室因为在市场上的巨大成功,盈利能力得到了很大的提高,所以老总们就不再共享女秘书了:

class NvMishu {
    public void fuwu() {
        System.out.println("服务");
    }
}

接着又过了一段时间,有位老总不再满足女秘书于女秘书单调的服务,他还要求像水手般的服务。秘书处的人灵机一动,我们不能因为这个就重新招哥秘书,但是我们可以买套水手服让这个秘书穿上啊:

class NvMishu {
    public void fuwu() {
        System.out.println("服务");
    }
}

class ShuiShou {
    private NvMishu nms;
    public ShuiShou (NvMishu nms) {
        this.nms = nms;
    }
    public void fuwu() {
        this.nms.fuwu();
    }
    public void shuishoufeeling() {
        System.out.print("水手Feeling的");
        this.nms.fuwu();
    }
}

public class Decorator {
    public static void main(String[] args) {
        NvMishu nms = new NvMishu();
        ShuiShou ss = new ShuiShou(nms);
        ss.fuwu();
        ss.shuishoufeeling();
    }
}

其他两个老总一看,这个不错,于是也提出了自己的要求:一个要大学生的感觉,一个要良家的感觉。第一个老总却改变了主意,觉得女秘书不够刺激,想招一个男秘书。秘书处的人一下子头都大了,又是海量的工作阿,于是只能去请教我们的资深顾问林阿标(好吧,上篇因为提到不该提到的文字,只能改个名字了~,再次感谢伟大的自XX由)。

林阿标一听,这个容易阿,你们做衣服的时候别根据女秘书的体型阿,而是根据秘书的体型阿,反正女秘书和男秘书都是秘书嘛,而且衣服也不在乎包裹着的是什么样的身体:

interface Mishu {
    abstract public void fuwu();
}

class NvMishu implements Mishu{
    public void fuwu() {
        System.out.println("女秘书的服务");
    }
}
class NanMishu implements Mishu{
    public void fuwu() {
        System.out.println("男秘书的服务");
    }
}

class ShuiShou {
    private Mishu ms;
    public ShuiShou (Mishu ms) {
        this.ms = ms;
    }
    public void fuwu() {
        this.ms.fuwu();
    }
    public void shuishoufeeling() {
        System.out.print("水手Feeling的");
        this.ms.fuwu();
    }
}
class LiangJia {
    private Mishu ms;
    public LiangJia (Mishu ms) {
        this.ms = ms;
    }
    public void fuwu() {
        this.ms.fuwu();
    }
    public void liangjiafeeling() {
        System.out.print("良家Feeling的");
        this.ms.fuwu();
    }
}


public class Decorator {
    public static void main(String[] args) {
        ShuiShou ss = new ShuiShou(new NanMishu());
        ss.fuwu();
        ss.shuishoufeeling();
        
        Mishu ms = new NvMishu();
        LiangJia lj = new LiangJia(ms);
        lj.fuwu();
        lj.liangjiafeeling();
        ShuiShou ssA = new ShuiShou(ms);
        ssA.fuwu();
        ssA.shuishoufeeling();
    }
}

这下老总们满意了,但是秘书们不高兴了,有的时候老总要的急,刚穿上良家装,又得脱下换上水手装,然后又得换回去,这可怎生纠结,于是林阿标顾问又提出了改进意见:不管是穿上“水手”服还是“良家”服的“男秘书”,“女秘书”都还必须是“秘书”。那么只要让“水手”和“良家”实现“秘书”接口,就能直接穿其他的服装而不需要脱了阿:

interface Mishu {
    abstract public void fuwu();
}

class NvMishu implements Mishu{
    public void fuwu() {
        System.out.println("女秘书的服务");
    }
}
class NanMishu implements Mishu{
    public void fuwu() {
        System.out.println("男秘书的服务");
    }
}

class ShuiShou implements Mishu{
    private Mishu ms;
    public ShuiShou (Mishu ms) {
        this.ms = ms;
    }
    public void fuwu() {
        this.ms.fuwu();
    }
    public void shuishoufeeling() {
        System.out.print("水手Feeling的");
        this.ms.fuwu();
    }
}
class LiangJia implements Mishu{
    private Mishu ms;
    public LiangJia (Mishu ms) {
        this.ms = ms;
    }
    public void fuwu() {
        this.ms.fuwu();
    }
    public void liangjiafeeling() {
        System.out.print("良家Feeling的");
        this.ms.fuwu();
    }
}

public class Decorator {
    public static void main(String[] args) {
        Mishu ms = new NvMishu();
        //现在秘书就算套上无数套衣服也能正常工作了
        ShuiShou ssA = new ShuiShou(new LiangJia(new ShuiShou(new LiangJia(new ShuiShou(new LiangJia(ms))))));
        ssA.fuwu();
        ssA.shuishoufeeling();
    }
}

上面就是完整的装饰者模式的代码,其中男女秘书是被装饰者,而水手和良家是装饰者。

当然在Java中有着更加经典的例子: java.io.*, 有兴趣的可以研究下。

posted @ 2013-05-17 15:10  biglaojiang  阅读(1363)  评论(0编辑  收藏  举报