zoukankan      html  css  js  c++  java
  • 无废话设计模式(7)结构型模式--装饰模式

    0-前言

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

    1-实现

    1-1、易看的UML图:

    1-2、代码实现:

    //1、演员类(component,直接实现,未抽取父类,可抽取父类)
    class  Actor
    {
        public void  Act()
        {
            System.out.println("演员开始表演了");
        }
    }
    
    //2、Decorator(装饰抽象类)
    class  Stylist extends Actor
    {
        protected  Actor actor;
    
        public void  MakeActor(Actor _actor)
        {
            this.actor = _actor;
        }
    
        @Override
        public void Act()
        {
            if (actor !=null)
            {
                actor.Act();
            }
        }
    }
    
    //2-1、ConcreteComponentA(具体装饰者A--古装造型师)
    class AncientStylist extends Stylist
    {
        private String State;
    
        @Override
        public void Act()
        {
            System.out.println("古装造型师给演员化妆了");
            State  = "演员状态挺好的";
            System.out.println(State);
            super.Act();
        }
    }
    
    //2-2、ConcreteComponentB(具体装饰者B)
    class ModernStylist extends Stylist
    {
        public void AddBehaver()
        {
            System.out.println("给演员打了个气");
        }
    
        @Override
        public void Act()
        {
            System.out.println("现代造型师给演员化妆了");
            AddBehaver();
            super.Act();
        }

    客户端:

            Actor actor = new Actor();
            AncientStylist ancientStylist =new AncientStylist();
            ModernStylist modernStylist = new ModernStylist();
    
            ancientStylist.MakeActor(actor);
            ancientStylist.Act();
    
            modernStylist.MakeActor(actor);
            modernStylist.Act();

    运行结果:

    2、应用场景简单总结

    1、当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时;

    2、当需要将对象的某些职责进行撤销操作时;

    3、当不能用生成子类的方法进行当前系统的扩充时;

  • 相关阅读:
    SDL 学习及相关API
    ppm图像格式
    Gstreamer学习
    GObject对象系统
    Linux下查看文件和文件夹大小
    将输入的字符串按指定的长度进行拆分
    Ubuntu12.04 下安装Chrome浏览器
    Ubuntu12.04 下搭建Java开发环境
    Android 之 WebView
    Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)
  • 原文地址:https://www.cnblogs.com/yanghj/p/13411310.html
Copyright © 2011-2022 走看看