首页 > 其他 > 详细

装饰者模式

时间:2019-04-02 14:43:31      阅读:122      评论:0      收藏:0      [点我收藏+]

昨天面试Java后端被问到代理模式装饰者模式,其中装饰者模式,记得是子类不断装饰(添加功能),但具体结构忘记了- -!没有答上。
ps:遇到的面试官还好,设计模式没有深究。

回家赶紧翻大话设计模式查阅。

类图

技术分享图片

实现要点

  • 定义基础装饰类,包含被装饰类属性、设置属性的装饰方法、定义功能方法调用被装饰类的功能方法

  • 具体各装饰类,继承自基础装饰类,重写功能方法,调用父类的方法和添加特有的功能。

Java示例

/**
 * @author cdfive
 * @date 2019-04-01
 */
public class DecoratorPattern {

    private static class Person {
        private String name;

        public Person() {
        }

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

        public void show() {
            System.out.println(String.format("装扮的%s", name));
        }
    }

    private static class Finery extends Person {

        protected Person person;

        public void decorate(Person person) {
            this.person = person;
        }

        @Override
        public void show() {
            if (person != null) {
                person.show();
            }
        }
    }

    private static class TShirts extends Finery {
        @Override
        public void show() {
            System.out.print("大T恤 ");
            super.show();
        }
    }

    private static class TXue extends Finery {
        @Override
        public void show() {
            System.out.print("大T恤 ");
            super.show();
        }
    }

    private static class Xizhuang extends Finery {
        @Override
        public void show() {
            System.out.print("西装 ");
            super.show();
        }
    }

    private static class NiuZai extends Finery {
        @Override
        public void show() {
            System.out.print("牛仔 ");
            super.show();
        }
    }

    private static class LingDai extends Finery {
        @Override
        public void show() {
            System.out.print("领带 ");
            super.show();
        }
    }

    private static class QiuXie extends Finery {
        @Override
        public void show() {
            System.out.print("球鞋 ");
            super.show();
        }
    }

    private static class PiXie extends Finery {
        @Override
        public void show() {
            System.out.print("皮鞋 ");
            super.show();
        }
    }

    public static void main(String[] args) {
        Person person = new Person("张三");

        System.out.println("-----第一种装扮-----");
        TXue tXue = new TXue();
        NiuZai niuZai = new NiuZai();
        QiuXie qiuXie = new QiuXie();

        tXue.decorate(person);
        niuZai.decorate(tXue);
        qiuXie.decorate(niuZai);
        qiuXie.show();

        System.out.println("-----第二种装扮-----");
        Xizhuang xizhuang = new Xizhuang();
        LingDai lingDai = new LingDai();
        PiXie piXie = new PiXie();
        xizhuang.decorate(person);
        lingDai.decorate(xizhuang);
        piXie.decorate(lingDai);
        piXie.show();

        System.out.println("-----第三种装扮-----");
        piXie.decorate(person);
        niuZai.decorate(piXie);
        tXue.decorate(niuZai);
        tXue.show();
    }
}

装饰者模式

原文:https://www.cnblogs.com/cdfive2018/p/10642321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!