zoukankan      html  css  js  c++  java
  • 12、Decorator 装饰器 模式 装饰起来美美哒 结构型设计模式

    1、Decorator模式

    装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    2、介绍

    使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

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

    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    缺点:多层装饰比较复杂。

    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    3、示例代码

    示例以: 明星和普通人 俩种角色开题,示例演示俩种不同角色的穿衣,以及品牌

    定义PersonComponent类

     package cn.design.structured.decorator;
     
     /**
      * @author lin
      * @version 1.0
      * @date 2020-07-24 17:32
      * @Description TODO
      */
     public interface  PersonComponent {
     
         String toDoingDay();
     
         String getRole();
     }
     

    定义ConCreatePersonComponent类

     package cn.design.structured.decorator;
     
     /**
      * @author lin
      * @version 1.0
      * @date 2020-07-24 17:37
      * @Description TODO
      */
     public class ConCreatePersonComponent implements PersonComponent {
         String name;
         String role;
         String faxing;
         /**
          * 上装
          */
         String jacket;
         /**
          * 下装
          */
         String bottoms;
         String shoes;
     
         public ConCreatePersonComponent(String name, String role, String faxing, String jacket, String bottoms, String shoes) {
             this.name = name;
             this.role = role;
             this.faxing = faxing;
             this.jacket = jacket;
             this.bottoms = bottoms;
             this.shoes = shoes;
        }
     
         @Override
         public String toDoingDay() {
             return "name='" + name + ",role=" + role + ",今天发型faxing=" + faxing + ",上装jacket=" + jacket + ",下装bottoms=" + bottoms + ",鞋子shoes=" + shoes + " 过了一天";
        }
     
         @Override
         public String getRole() {
             return role;
        }
     
     }
     

    定义BaseDecorator类

     package cn.design.structured.decorator;
     
     /**
      * @author lin
      * @version 1.0
      * @date 2020-07-24 17:40
      * @Description TODO
      */
     public abstract class BaseDecorator implements PersonComponent {
         String decoratorStr;
         PersonComponent component;
     
         public BaseDecorator(PersonComponent component) {
             this.component = component;
        }
     
         @Override
         public String toDoingDay() {
             String role = component.getRole();
     
             if (role.equalsIgnoreCase("star")) {
                 decoratorStr = " today 吃雪糕,骑着自行车 ";
            } else {
                 decoratorStr = " today 吃西餐,开车奔驰 ";
            }
             String str = component.toDoingDay();
             return decoratorStr + ";" + str;
        }
     
     
     }
     

    定义ConCreateBaseDecorator类

     package cn.design.structured.decorator;
     
     /**
      * @author lin
      * @version 1.0
      * @date 2020-07-24 17:49
      * @Description TODO
      */
     public class ConCreateBaseDecorator extends BaseDecorator {
     
     
         public ConCreateBaseDecorator(PersonComponent component) {
             super(component);
        }
     
         @Override
         public String toDoingDay() {
             String old = super.toDoingDay();
             String role = component.getRole();
             if (role.equalsIgnoreCase("star")) {
                 decoratorStr += ("; ConCreateBaseDecorator 装备升级 周围围着很多小迷妹");
            } else {
                 decoratorStr += ("; ConCreateBaseDecorator 糟糕 被老师叫到了 办公室");
            }
             return decoratorStr + ";" +
                     old + ";";
        }
     
         @Override
         public String getRole() {
             return null;
        }
     
     }
     

    定义DecoratorMain测试类

     package cn.design.structured.decorator;
     
     /**
      * @author lin
      * @version 1.0
      * @date 2020-07-24 17:32
      * @Description TODO
      */
     public class DecoratorMain {
         public static void main(String[] args) {
             PersonComponent student = new ConCreatePersonComponent("小明", "student", "平头", "校服", "休闲裤", "老北京拖鞋");
             PersonComponent star = new ConCreatePersonComponent("黄晓明", "star", "大背头", "西装", "西裤", "芬迪皮鞋");
             // 普通修饰
             BaseDecorator b1 = new ConCreateBaseDecorator(student);
             System.out.println(b1.toDoingDay());
             // 精装修
             BaseDecorator b2 = new ConCreateBaseDecorator(star);
             System.out.println(b2.toDoingDay());
        }
     
     }
     

    运行结果如下:

      today 吃西餐,开车奔驰  ; ConCreateBaseDecorator 糟糕 被老师叫到了 办公室; today 吃西餐,开车奔驰  ;name='小明,role=student,今天发型faxing=平头,上装jacket=校服,下装bottoms=休闲裤,鞋子shoes=老北京拖鞋 过了一天;
      today 吃雪糕,骑着自行车 ; ConCreateBaseDecorator 装备升级 周围围着很多小迷妹; today 吃雪糕,骑着自行车  ;name='黄晓明,role=star,今天发型faxing=大背头,上装jacket=西装,下装bottoms=西裤,鞋子shoes=芬迪皮鞋 过了一天;

    4、深入了解

    类图:

    image-20200724181819073

    角色:

    ◆Component

    增加功能时的核心角色。以本章开头的例子来说,装饰前的蛋糕就是Component角色。 Component角色只是定义了蛋糕的接口( API)。在示例程序中,由Display类扮演此角色。

    ◆ConcreteComponent

    该角色是实现了Component角色所定义的接口(API)的具体蛋糕。在示例程序中,由 StringDisplay类扮演此角色。

    ◆Decorator (装饰物)

    该角色具有与Component角色相同的接口( API)。在它内部保存了被装饰对象一Component 角色。Decorator 角色知道自己要装饰的对象。在示例程序中,由Border类扮演此角色。

    ◆ConcreteDecorator (具体的装饰物)

    该角色是具体的Decorator角色。在示例程序中,由SideBorder类和FullBorder类扮演 此角色。

     

    公众号发哥讲

    这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。

    代码分享

    https://gitee.com/naimaohome

    微信公众号 点击关于我,加入QQ群,即可获取到代码以及高级进阶视频和电子书!!

    img

    如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

    ● 扫码关注我们

    据说看到好文章不推荐的人,服务器容易宕机!

    本文版权归 发哥讲博客园 共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。

     

     

  • 相关阅读:
    HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
    php中0," ",null和false的区别
    php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项。
    php 解决上传中文文件名时出现乱码的问题
    php学习之有用的资源 总结
    php 问题及原因总结
    php 汉字验证码
    php 图片验证码
    php 字母和数字验证码
    php 使用imagettftext()函数出问题的原因
  • 原文地址:https://www.cnblogs.com/naimao/p/13446458.html
Copyright © 2011-2022 走看看