zoukankan      html  css  js  c++  java
  • 装饰模式

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

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

    定义

    装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。

    类图

    实现要点

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

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

    Java示例

    /**
     * @author cdfive
     * @date 2019-04-01
     */
    public class DecoratorDemo {
    
        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();
        }
    }
    
  • 相关阅读:
    使用node.js和socket.io实现多人聊天室
    linux上如何自动获取ip及连接互联网
    大数据 时间同步问题 解决hbase集群节点HRegionServer启动后自动关闭
    大数据环境完全分布式搭建hbase-0.96.2-hadoop2
    大数据环境完全分布式搭建 hadoop2.4.1
    大数据环境完全分布式搭建linux(centos)中安装zookeeper
    虚拟机中操作系统的克隆方法及ip修改及硬件地址修改
    在Windows系统下安装Beautiful Soup4的步骤和方法
    在eclipse中配置Python环境
    python3.4爬取网页的乱码问题
  • 原文地址:https://www.cnblogs.com/cdfive2018/p/10642321.html
Copyright © 2011-2022 走看看