Decorator模式(装饰器模式)

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; } } 感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。 分类: Design Patternshttps://www.cnblogs.com/dgwblog/p/9846783.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信