装饰器模式-Decorator(Java实现)

装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构。

其中 "现有对象"在本文中是StringDisplay类.

添加新的功能的对象在本文中是: SideBorder类 和 FullBorder类

Display接口

public interface Display {
int getColumns(); int getRows(); String getRowText(int row); default void show() {
for (int i = 0; i < getRows(); i++) {
System.out.println(getRowText(i));
}
}
}

StringDisplay类

基础功能类, 用于打印字符串.

public class StringDisplay implements Display {
private String string; public StringDisplay(String s) {
string = s;
} @Override
public int getColumns() {
return string.length();
} @Override
public int getRows() {
return 1;
} @Override
public String getRowText(int row) {
if (row == 0) {
return string;
} else {
return null;
}
}
}

使用方式如下:

Display b1 = new StringDisplay("Hello, world.");
b1.show();

装饰器类

AbstractBorder抽象类

这是具体装饰器类的抽象定义, 为了装饰后也能统一对外的接口, 这里也继承了Display接口

public abstract class AbstractBorder implements Display {
Display display; public AbstractBorder(Display display) {
this.display = display;
}
}

SideBorder类

本类是一个装饰器

public class SideBorder extends AbstractBorder {
private char borderchar; public SideBorder(Display display, char ch) {
super(display);
this.borderchar = ch;
} @Override
public int getColumns() {
return 1 + display.getColumns() + 1;
} @Override
public int getRows() {
return display.getRows();
} @Override
public String getRowText(int row) {
return borderchar + display.getRowText(row) + borderchar;
}
}

使用方式如下:

把一个SideBorder装饰器添加到StringDisplay上, 于是乎"Hello, world." 就变成了 "#Hello, world.#"

        Display b1 = new StringDisplay("Hello, world.");
Display b2 = new SideBorder(b1, '#');
b2.show();

FullBorder类

本类是一个装饰器

public class FullBorder extends AbstractBorder {
public FullBorder(Display display) {
super(display);
} @Override
public int getColumns() {
return 1 + display.getColumns() + 1;
} @Override
public int getRows() {
return 1 + display.getRows() + 1;
} @Override
public String getRowText(int row) { // 指定的那一行的字符串
if (row == 0) { // 上边框
return "+" + makeLine('-', display.getColumns()) + "+";
} else if (row == display.getRows() + 1) { // 下边框
return "+" + makeLine('-', display.getColumns()) + "+";
} else { // 其他边框
return "|" + display.getRowText(row - 1) + "|";
}
} private String makeLine(char ch, int count) { // 生成一个重复count次字符ch的字符串
StringBuffer buf = new StringBuffer();
for (int i = 0; i < count; i++) {
buf.append(ch);
}
return buf.toString();
}
}

使用方式如下:

把一个FullBorder装饰器添加到StringDisplay上, 于是乎"Hello, world." 就变成了->

+------ --+

|Hello, world.|

+---------+

        Display b1 = new StringDisplay("Hello, world.");
Display b3 = new FullBorder(b1);
b3.show();

Main

运行测试

public class Main {
public static void main(String[] args) {
Display b4 =
new SideBorder(
new FullBorder(
new FullBorder(
new SideBorder(
new FullBorder(
new StringDisplay("1234567")
), '*'
)
)
), '/'
);
b4.show();
}
}

装饰器模式-Decorator(Java实现)的更多相关文章

  1. 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

    <?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...

  2. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  3. 装饰器模式(Decorator)

    转自http://blog.csdn.net/hust_is_lcd/article/details/7884320 1.认识装饰器模式 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象 ...

  4. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  5. 设计模式学习心得<装饰器模式 Decorator>

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

  6. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  7. 装饰器模式(Decorator)——深入理解与实战应用

    本文为原创博文,转载请注明出处,侵权必究! 1.初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装 ...

  8. 装饰器模式 Decorator 结构型 设计模式 (十)

    引子           现实世界的装饰器模式 大家应该都吃过手抓饼,本文装饰器模式以手抓饼为模型展开简介 "老板,来一个手抓饼,  加个培根,  加个鸡蛋,多少钱?" 这句话会不 ...

  9. 装饰器模式(Decorator) C++

    装饰器模式是比较常用的一种设计模式,Python中就内置了对于装饰器的支持. 具体来说,装饰器模式是用来给对象增加某些特性或者对被装饰对象进行某些修改. 如上图所示,需要被装饰的对象在最上方,它自身可 ...

随机推荐

  1. 卸载windows补丁

    wusa /uninstall /kb: wusa /uninstall /kb: 和某些应用软件冲突时,需要将上述补丁卸载.

  2. 20181219-PostgreSQL 流复制监控脚本

    PostgreSQL 流复制监控脚本 https://github.com/AndyYHM/Writing/blob/PostgreSQL/20181219-PostgreSQL%20Stream%2 ...

  3. Windows Server 2008远程桌面默认端口更改方法

    win2008远程桌面端口默认是用的是3389端口,但是由于安全考虑,经常我们安装好系统后一般都会考虑把原来的3389端口更改为另外的端口. 本文以改为端口为25608商品为例,讲解一下具体操作过程. ...

  4. .Net Core 在Linux服务器下部署程序--(4). 前端ReactWeb应用部署

    确认第二步中的软件已经安装完成 Nodejs前端Web服务器 Zip与UnZip压缩包软禁 nrm前端包源管理器 PM2前端Web程序守护进程 创建部署文件夹 如果已经执行过( 3. 租户平台后端程序 ...

  5. windows docker redis

    拉取docker docker pull hub.c.163.com/library/redis:latest 启动docker docker run -p 6379:6379 -d hub.c.16 ...

  6. C# -- 使用Parallel并行执行任务

    C#:使用Parallel并行执行任务 1. 代码实现 class Program { static void Main(string[] args) { TestParallel(); Consol ...

  7. LinuxMint(Ubuntu)安装文泉驿家族黑体字

    文泉驿黑体字家族在Ubuntu上很有用,可以解决系统字体发虚的问题. 通过下面的三条命令安装: sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑 sudo ...

  8. 百度地图引用时 报出A Parser-blocking, cross site (i.e. different eTLD+1) script

    页面引入百度地图api时 chrome控制台报出警示问题 A Parser-blocking, cross site (i.e. different eTLD+1) script, http://ap ...

  9. Mysql原理与优化

    原文:https://mp.weixin.qq.com/s__biz=MzI4NTA1MDEwNg==&mid=2650763421&idx=1&sn=2515421f09c1 ...

  10. 编译装php7.2 && nginx-1.14

    环境准备 # cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) # uname -r 3.10.0-957.el7.x86_64 ...