zoukankan      html  css  js  c++  java
  • 设计模式笔记之九 (装饰者模式)

    装饰者模式

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

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

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

    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.*, 有兴趣的可以研究下。

  • 相关阅读:
    linux虚拟机时间同步
    jdk的下载
    xshell 使用命令上传、下载文件
    linux常用命令
    linux使用"userdel 用户名“删除用户的解决办法
    List去重
    C#之数据类型学习
    EF中使用SQL语句或存储过程
    牛逼注释
    ASP.NET判断是否为手机登录
  • 原文地址:https://www.cnblogs.com/biglaojiang/p/3083727.html
Copyright © 2011-2022 走看看