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

Decorator模式(装饰器模式)的更多相关文章

  1. Decorator模式 装饰器模式

    Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加 ...

  2. Python3-设计模式-装饰器模式

    装饰器模式 动态的给原有对象添加一些额外的职责,面向切面编程(AOP),多用于和主业务无关,但又必须的业务,如:登录认证.加锁.权限检查等 Python代码实现示例 需求点: 1.在old_func( ...

  3. 装饰器模式(Decorator Pattern)

    装饰器模式 一.什么是装饰器模式   装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装 ...

  4. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  5. c#设计模式之装饰器模式(Decorator Pattern)

    引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...

  6. IOS设计模式之二(门面模式,装饰器模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  7. Java IO流以及装饰器模式在其上的运用

    流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...

  8. python设计模式之装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  9. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  10. java之装饰器模式

    Decorator Pattern(装饰器模式),定义:Attach additional responsibilities to an object dynamically. Decorators  ...

随机推荐

  1. Uva10366

    模拟乱搞 要说算法的话...乱搞算法? #include<iostream> #include<cstring> #include<algorithm> #incl ...

  2. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)

    http://hihocoder.com/problemset/problem/1290 这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试 ...

  3. ACM学习历程—SGU 275 To xor or not to xor(xor高斯消元)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=275 这是一道xor高斯消元. 题目大意是给了n个数,然后任取几个数,让他们xor和 ...

  4. 【Python】正则表达式中使用变量

    我们有时想把变量放进正则表达式中来匹配想要的结果.Python中使用 re.compile(r''+变量+''),其中正则表达式中的“变量”应为字符串形式. import re regex_test_ ...

  5. 上海-北京间通过Azure Storage的RA-GRS类型的存储账户进行快速复制

    Azure的Blob存储分成多种类型,目前主要有: 其中RA-GRS可以在上海-北京两个数据中心间同步数据.并且,在第二个数据中心可以只读的方式读取这个存储账户中的Blob内容. 虽然GRS采用的是准 ...

  6. 通过gitweb管理Puppet配置(nginx版本+lighttpd版)

    Puppet路径为:/etc/puppet 软件版本:gitweb-1.7.1-3.el6_4.1.noarch git-1.7.1-3.el6_4.1.x86_64 fcgi-2.4.0-12.el ...

  7. wpf 可视化树的注意点

    将控件的visibility 设置为collapse时,控件的可视化树并未生成,此时并不能查找到控件内的子控件. 若某控件想对用户不可见,且可以生成可视化树,则需将控件的visibility 设置为h ...

  8. js---数组习题---

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. mac tree 命令

    mac下默认是没有 tree命令的,不过我们可以使用find命令模拟出tree命令的效果,如显示当前目录的 tree 的命令: find . -print | sed -e 's;[^/]*/;|__ ...

  10. JS中数组方法小总结

    1.array.concat(item……) 返回:一个新数组 该方法产生一个新数组,它包含一份array的浅复制,并把一个或多个参数item附加在其后.如果参数item是一个数组,那么它的每个元素会 ...