博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器模式
阅读量:5864 次
发布时间:2019-06-19

本文共 2142 字,大约阅读时间需要 7 分钟。

定义

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

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。

img_9386920bd0cf0b6ab67ee7a286187ece.jpe
装饰器模式的 UML 图

步骤 1创建一个接口。Shape.javapublic interface Shape {   void draw();}步骤 2创建实现接口的实体类。Rectangle.javapublic class Rectangle implements Shape {   @Override   public void draw() {      System.out.println("Shape: Rectangle");   }}Circle.javapublic class Circle implements Shape {   @Override   public void draw() {      System.out.println("Shape: Circle");   }}步骤 3创建实现了 Shape 接口的抽象装饰类。ShapeDecorator.javapublic abstract class ShapeDecorator implements Shape {   protected Shape decoratedShape;   public ShapeDecorator(Shape decoratedShape){      this.decoratedShape = decoratedShape;   }   public void draw(){      decoratedShape.draw();   }    }步骤 4创建扩展了 ShapeDecorator 类的实体装饰类。RedShapeDecorator.javapublic class RedShapeDecorator extends ShapeDecorator {   public RedShapeDecorator(Shape decoratedShape) {      super(decoratedShape);           }   @Override   public void draw() {      decoratedShape.draw();                 setRedBorder(decoratedShape);   }   private void setRedBorder(Shape decoratedShape){      System.out.println("Border Color: Red");   }}步骤 5使用 RedShapeDecorator 来装饰 Shape 对象。DecoratorPatternDemo.javapublic 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 borderShape: CircleCircle of red borderShape: CircleBorder Color: RedRectangle of red borderShape: RectangleBorder Color: Red

转载地址:http://ewfnx.baihongyu.com/

你可能感兴趣的文章
关于vue带hash '#/' 微信分享后点开链接是首页的问题
查看>>
Slog12_支配vue框架模版语法之v-html
查看>>
Vue源码探究-构建版本的区别
查看>>
Linux下更换默认yum源为网易yum源
查看>>
关于读书,千万不要忽略输出
查看>>
手把手教你用vue搭建个人站
查看>>
js判断PC端还是移动端的代码小坑
查看>>
SpringBoot+RabbitMq实现延时消息队列
查看>>
8张图理解Java
查看>>
Go 采用 time.After 实现超时控制
查看>>
曾鸣:优秀是卓越最大的敌人 | 阿里内部干货
查看>>
肖威洞察 | Startup Salad创业沙拉(北京)黑客马拉松冠军 CoinXP 团队「工具包」满血大放送 ...
查看>>
泛化&泛化数据集&实验
查看>>
初识font-awesome
查看>>
图解 hexo + github 从零快速 搭建个人博客 windows
查看>>
CSS基础篇--快速使用CSS Grid布局,实现响应式设计
查看>>
css3小动画:鼠标hover后text-decoration的动画
查看>>
如何实现swipe、tap、longTap等自定义事件
查看>>
Angular 进阶:从源码理解@Input绑定是如何被编译和实现的
查看>>
Scrapy 框架入门简介
查看>>