博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器模式-Decorator(Java实现)
阅读量:4977 次
发布时间:2019-06-12

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

装饰器模式-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();    }}

 

转载于:https://www.cnblogs.com/noKing/p/9031626.html

你可能感兴趣的文章
Java线程池使用说明
查看>>
ectouch第十一讲 之 ECTouch 菜单里如何添加文章链接
查看>>
adb logcat
查看>>
VME总线 分类: 生活百科 2014-06-...
查看>>
C#中对Excel进行操作
查看>>
图片上传、拖拽排序
查看>>
xshell连接Ubuntu虚拟机
查看>>
路由器的四个主要内存区域
查看>>
四则运算题测试阶段
查看>>
PHP生成验证码及单实例应用
查看>>
FindBugs的安装及使用
查看>>
调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type
查看>>
mysql之数据类型
查看>>
软体切割
查看>>
数字信号相关和卷积
查看>>
[CSAPP]Bufbomb实验报告
查看>>
NaviActivity实现
查看>>
将已安装win10的系统重装(格式化C盘)
查看>>
C# 中的委托和事件
查看>>
CSS基础学习 17.CSS动画
查看>>