设计模式(JAVA)——Decorator模式

1. Decorator模式

不段地为对象增加装饰(功能)的设计模式被称为Decorator模式

1.1 Decorator模式的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ls5y8Bgz-1573828460788)(./resources/image/12/12-1_Decorator.png)]

登场的角色:

  • Component(组件)
    增加功能时的核心角色。

  • ConcreteComponent
    实现了Component角色所定义的接口

  • Decorator(装饰物)
    与Component角色具有相同的接口。在它内部保存了被装饰的对象

  • ConcreteDecorator
    具体的装饰物

1.2 示例程序

类一览表:

名称说明
Display用于显示字符串的抽象类
StringDisplay显示单行字符串
Border用于显示边框的抽象类
SideBorder装饰左右边框
FullBorder装饰上下左右边框
Main测试类

uml类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XU2HHGBF-1573828460790)(./resources/image/12/12-2.png)]

Display类

package xin.ajay.decorator;

public abstract class Display {
    public abstract int getColumns();
    public abstract int getRows();
    public abstract String getRowText(int row);

    public final void show(){
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }
}

StringDisplay类

package xin.ajay.decorator;

public class StringDisplay extends Display {
    private String msg;

    public StringDisplay(String msg) {
        this.msg = msg;
    }

    @Override
    public int getColumns() {
        return msg.getBytes().length;
    }

    @Override
    public int getRows() {
        return 1;
    }

    @Override
    public String getRowText(int row) {
        if(row==0){
            return msg;
        }
        return null;
    }
}

Border类

package xin.ajay.decorator;

public abstract class Border extends Display {
    protected Display display;

    protected Border(Display display){
        this.display = display;
    }

}

SideBorder类

package xin.ajay.decorator;

public class SideBorder extends Border {
    private char borderChar;

    public SideBorder(Display display, char borderChar) {
        super(display);
        this.borderChar = borderChar;
    }

    @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;
    }
}

FullBorder类

package xin.ajay.decorator;

public class FullBorder extends Border {
    protected 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 c, int columns) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < columns; i++) {
            builder.append(c);
        }
        return builder.toString();
    }
}

Main类

package xin.ajay.decorator;

public class Main {
    public static void main(String[] args) {
        StringDisplay display = new StringDisplay("hello");
        SideBorder b1 = new SideBorder(display, '#');
        FullBorder b2 = new FullBorder(b1);

        display.show();
        b1.show();
        b2.show();


    }
}

结果

hello
#hello#
+-------+
|#hello#|
+-------+
鸣谢

GoF《设计模式》和结城浩的《图解设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值