Decorator模式(装饰器模式)

本文深入探讨了Decorator模式,一种允许在不改变对象结构的前提下动态添加职责的设计模式。通过Java I/O中的例子,展示了如何通过装饰器模式对基础对象进行职责增强,实现如边界装饰等效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Decorator模式?

假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕
像这样不断地为对象添加装饰的设计模式被称为Decorator模式

  • 简单描述:一个基础共有的对象,你想赋予它什么责者那么你添加相关的职责修饰,这就是装饰器模式
  • Java I/O 中使用适配器的:

1160484-20181024224711956-398105312.png

1160484-20181024224715878-1300642282.png

理清职责

作用:对普通的字符串,通过加入边框进行描述
名字============》》说明
Display ||| 用于显示字符串的抽象类
stringDisplay ||| 用于显示单行字符串的类
Border ||| 用于显示装饰边框的抽象类
sideBorder ||| 用于只显示左右边框的类
Fu11Border ||| 用于显示上下左右边框的类
Main ||| 测试程序行为的类

  • 关系对象图:

1160484-20181024224722956-289640359.png

UML

1160484-20181024224828851-1449443897.png

Code
  • MainT
public class MainT {

    public static void main(String[] args) {

        Display display=new StringDisplay("hello decorator");

        display.show();

        Display display1=new SideBorder(display,'#');

        display1.show();

        Display fullBorder = new FullBorder(display1);

        fullBorder.show();

        Display display2=new SideBorder(
                new FullBorder(
                        new FullBorder(
                                new SideBorder(
                                        new FullBorder(
                                                new StringDisplay("Lets it go")
                                        ),
                                        '*'
                                )
                        )
                )
        ,'/');
        display2.show();



    }
}
  • Display
public abstract class Display {

    // 获取横向字符数
    public abstract int getColumns();

    // 获取纵向行数
    public abstract int getRows();

    // 获取row行字符
    public abstract String getRowText(int row);

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

}


  • StringDisplay

public class StringDisplay extends Display {

    private String string;

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

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

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

    @Override
    public String getRowText(int row) {
        return row==0? string: null;
    }
}

  • FullBorder
public class FullBorder extends Border {


    public FullBorder(Display display) {
        super(display);
    }

    @Override
    public int getColumns() {
        return display.getColumns()+2;
    }

    @Override
    public int getRows() {
        return display.getRows()+2;
    }

    @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(String s, int columns) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < columns; i++) {
            buffer.append(s);
        }
        return buffer.toString();
    }
}

  • SideBorder
public class SideBorder extends Border {

    private char aChar;

    public SideBorder(Display display,char ch) {
        super(display);
        this.aChar=ch;

    }

    @Override
    public int getColumns() {
        return display.getColumns()+2;
    }

    @Override
    public int getRows() {
        return display.getRows();
    }

    @Override
    public String getRowText(int row) {
        return aChar+display.getRowText(row)+aChar;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值