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

最新文章

  1. 【CISP笔记】安全漏洞与恶意代码(1)
  2. 【HDU】1847 Good Luck in CET-4 Everybody!
  3. 数组链表下标指针map list
  4. jndi配置数据源
  5. Hive1.3 JDBC连接-代码片段
  6. Pimp_my_Z1
  7. Android布局中的空格以及占一个汉字宽度的空格的实现
  8. shark错误:Query returned non-zero code: -101
  9. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
  10. javascript中子类如何继承父类
  11. iOS开发面试题整理 (一)
  12. firemonkey打开子窗体(匿名回调函数)
  13. 时间戳timestamp
  14. How to enable your website to public(set up your web server at home)
  15. golang 轮训加密算法
  16. 【NOI2014】魔法森林
  17. IO (三)
  18. 如何查看卖家ID (Merchant ID) 亚马逊哪里找?
  19. node.js cluster模式启用方式
  20. linux下MySQL使用方法

热门文章

  1. phpunit手动配置
  2. ACM学习历程—HDU 5072 Coprime(容斥原理)
  3. HEOI2017题解
  4. UILabel的富文本显示选项
  5. UOJ#164:【清华集训2015】V
  6. 人物-IT-马化腾:马化腾
  7. rails中一个窗体多个模型——fields_for
  8. linux日常管理-rsync后台服务方式-2
  9. ADO.NET 对象
  10. CentOS 7 配置 http 服务器