详解java装饰模式(Decorator Pattern)

一、装饰器模式(Decorator Pattern)

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

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

我们通过下面的实例来演示装饰器模式的使用。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

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

RedShapeDecorator 是实现了ShapeDecorator 的实体类。

DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。

步骤 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 decoratedShape;

public ShapeDecorator(Shape decoratedShape){

this.decoratedShape = decoratedShape;

}

public void draw(){

decoratedShape.draw();

}

}

步骤 4创建扩展自 ShapeDecorator 类的实体装饰类。

RedShapeDecorator.java

public 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.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

希望本文所述对大家学习java程序设计有所帮助。相关阅读:

jQuery:delegate中select()不起作用的解决方法(实例讲解)

php使用异或实现的加密解密实例

Java判断字符串为空、字符串是否为数字

Android实现使用流媒体播放远程mp3文件的方法

11个实用的Linux终端命令总结

JavaScript实现鼠标点击后层展开效果的方法

深入理解jQuery中live与bind方法的区别

深入解析php之sphinx

MySQL笔记之子查询使用介绍

极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg

HTML5中的强制下载属性download使用实例解析

html5+javascript制作简易画板附图

Android使用criteria选择合适的地理位置服务实现方法

Win7系统怎么查看电脑有没有无线网卡?Win7系统一体机/台式机无线网卡的两种查看方法

decorator java_java_详解java装饰模式(Decorator Pattern),一、装饰器模式(Decorator Patter - phpStudy...相关推荐

  1. decorator java_装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

  2. c语言装饰,C/C++知识点之装饰器模式(Decorator) C++

    本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...

  3. 【Java设计模式系列】装饰器模式(Decorator Pattern)

    简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...

  4. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  5. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  6. 装饰器模式--Decorator

    装饰器模式 定义: 装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将一些新的功能动态的添加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模 ...

  7. MobX详解(二):ES7 装饰器 decorator

    在学习ES7装饰器语法之前,需要先温习一下ES5的一些基础知识. 假设有对象如下:(便于理解) var person = {name: 'TOM' } 在ES5中,对象中的每个属性都有一个特性值来描述 ...

  8. 装饰器模式(Decorator)

    一.装饰者模式的定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 结构: 装饰器UML.png (1)抽象构件( ...

  9. 装饰器模式 decorator

    所有的说明和解释都在代码中有注释来标明 package mode.decorator;/*** * 这里定义一个接口,在接口中定义我们要执行的操作.* * 以后所有的装饰器以及我们要装饰的对象都要实现 ...

最新文章

  1. c++创建包含opencv的dll供C,C#调用
  2. EXCEL中SUMIF函数介绍
  3. 史上最全29个自我管理工具!
  4. 【CSS】背景遮罩层各种情况下,CSS样式
  5. 李大维:互联网人做硬件创业容易产生的七大误解【转载】
  6. 数控镗铣床行业调研报告 - 市场现状分析与发展前景预测
  7. Java中的泛型全解析(二)
  8. 《Joel On Software》读后
  9. BZOJ2330:[SCOI2011]糖果(差分约束)
  10. 日记侠:我为什么学习网络营销
  11. Altium Designer 14安装教程(详细版)
  12. 金蝶系统无法建立数据可连接服务器,金蝶K3打开,提示无法建立数据链接
  13. xz1刷Android10,索尼xz1国行版安卓9.0固件
  14. 热敏电阻、RTD、热电偶的原理和特性
  15. 军火库(第一期):无线电硬件安全大牛都用哪些利器?
  16. 信号基础知识--FFT DFT
  17. mysql 按中文字段排序
  18. SpringBoot+Vue搭建前后端分离的轻博客
  19. java文档注释生产api没有注释_如何使用javadoc命令生成api文档,文档注释
  20. 信息化管理技术-制造执行系统(MES) – MES项目的规划和应用

热门文章

  1. 姚希燕:男士脱发等级划分
  2. 20220402java学习笔记 ------枚举与泛化
  3. matlab三维可视化,三维可视化 - MATLAB Simulink - MathWorks 中国
  4. XXL-JOB执行器注册成功但是在管理界面里不显示
  5. 奇安信2022秋招面经-技术支持岗
  6. 网站建设SEO运营规划:2021年的第一个网站!
  7. 跳棋的C语言,跳棋游戏C语言程序设计(数据结构课程设计).doc
  8. matlab roots 多项式实现 c语言,Matlab教学课apos;件教学教案.doc
  9. 2020金属非金属矿山(小型露天采石场)安全管理人员考试题库及金属非金属矿山(小型露天采石场)安全管理人员模拟考试题
  10. 学习周报之第十三周(数据分析)