装饰器模式 小灰灰 2020-06-13 05:56 770阅读 0赞 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 ### 介绍 ### **意图**:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 **主要解决**:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。 **何时使用**:在不想增加很多子类的情况下扩展类。 **如何解决**:将具体功能职责划分,同时继承装饰者模式。 **关键代码**: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。 **应用实例** :1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。 \*\*优点:\*\*装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 **缺点**:多层装饰比较复杂。 **使用场景** :1、扩展一个类的功能。 2、动态增加功能,动态撤销。 **注意事项**:可代替继承。 ### 实现 ### 我们将创建一个 *Shape* 接口和实现了 *Shape* 接口的实体类。然后我们创建一个实现了 *Shape* 接口的抽象装饰类 *ShapeDecorator*,并把 *Shape* 对象作为它的实例变量。 *RedShapeDecorator* 是实现了 *ShapeDecorator* 的实体类。 *DecoratorPatternDemo*,我们的演示类使用 *RedShapeDecorator* 来装饰 *Shape* 对象。 ![装饰器模式][format_png] #### 步骤 1 #### 创建一个接口。 *Shape.java* public interface Shape { void draw(); } #### 步骤 2 #### 创建实现接口的实体类。 *Rectangle.java* public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } } *Circle.java* public class Circle implements Shape { @Override public void draw() { System.out.println("Shape: Circle"); } } #### 步骤 3 #### 创建实现了 *Shape* 接口的抽象装饰类。 *ShapeDecorator.java* public abstract class ShapeDecorator implements Shape { protected Shape decoratorShape; public ShapeDecorator(Shape decoratorShape) { this.decoratorShape = decoratorShape; } @Override public void draw() { decoratorShape.draw(); } } #### 步骤 4 #### 创建扩展了 *ShapeDecorator* 类的实体装饰类。 *RedShapeDecorator.java* public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratorShape) { super(decoratorShape); } @Override public void draw() { decoratorShape.draw(); setRedBorder(decoratorShape); } private void setRedBorder(Shape decoratorShape) { System.out.println("Border Color: Red"); } } #### 步骤 5 #### 使用 *RedShapeDecorator* 来装饰 *Shape* 对象。 *DecoratorPatternDemo.java* public class DecoratorPatternDemo { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); System.out.println("Circle with normal border"); circle.draw(); System.out.println("\nCircle of red border"); redCircle.draw(); System.out.println("\nRectangle of red border"); redRectangle.draw(); } } #### 步骤 6 #### 验证输出。 Circle with normal border Shape: Circle Circle of red border Shape: Circle Border Color: Red Rectangle of red border Shape: Rectangle Border Color: Red [format_png]: /images/1592027765474.jpg
相关 装饰器模式 装饰器模式就是一种通过组合方式实现扩展的设计模式,装饰器的核心思想是为已有实现类创建多个包装类,由这些新增的包装类完成新需求的扩展。 装饰器模 以你之姓@/ 2022年09月10日 08:18/ 0 赞/ 45 阅读
相关 装饰器模式 装饰器模式 <?php class BaseArticle{ protected $art = null; protected 我会带着你远行/ 2022年07月21日 01:28/ 0 赞/ 212 阅读
相关 装饰器模式 1 <?php 2 //装饰器模式-在不改变原有类的结构上,对类的功能那个作补充 3 4 //武器基类 5 abstract 秒速五厘米/ 2022年06月16日 00:00/ 0 赞/ 198 阅读
相关 装饰器模式 在学装饰器模式的时候,我想到了责任链模式中的级别这个概念,为什么这么说,在一个OA系统中我们会有不同级别(或者说权限范围不同)的管理员,首先我们要明确不同级别的管理员它也是管理 深碍√TFBOYSˉ_/ 2022年05月08日 06:14/ 0 赞/ 220 阅读
相关 装饰器模式 1、初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下: ![watermark_type_ZmFuZ3poZW 小鱼儿/ 2022年04月24日 08:50/ 0 赞/ 246 阅读
相关 装饰器模式 ![Fpm6gbuGrUYHxqlnbEc-syPtY1Y3][] 什么是装饰器? 装饰器设计模式 > 装饰器模式(Decorator Pattern)允许向一个现有 ╰半橙微兮°/ 2022年04月21日 22:36/ 0 赞/ 235 阅读
相关 装饰器模式 一、基类 ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] /----------------------- £神魔★判官ぃ/ 2021年09月30日 08:42/ 0 赞/ 366 阅读
相关 装饰器模式 7.装饰器模式 ![70][] ![70 1][] class Program { static void Main( 拼搏现实的明天。/ 2021年09月16日 23:56/ 0 赞/ 334 阅读
相关 装饰器模式 ![5057999-ef364c6262961125.png][] image.png 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模 超、凢脫俗/ 2021年09月12日 02:16/ 0 赞/ 373 阅读
相关 装饰器模式 饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种... 小灰灰/ 2020年06月13日 05:56/ 0 赞/ 771 阅读
还没有评论,来说两句吧...