Decorator模式(装饰器模式)

xiaoxiao2025-05-23  29

Decorator模式?

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

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

理清职责

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

关系对象图:

UML

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; } }
转载请注明原文地址: https://www.6miu.com/read-5030587.html

最新回复(0)