Decorator模式?

假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕

像这样不断地为对象添加装饰的设计模式被称为Decorator模式

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

理清职责

作用:对普通的字符串,通过加入边框进行描述

名字============》》说明

Display ||| 用于显示字符串的抽象类

stringDisplay ||| 用于显示单行字符串的类

Border ||| 用于显示装饰边框的抽象类

sideBorder ||| 用于只显示左右边框的类

Fu11Border ||| 用于显示上下左右边框的类

Main ||| 测试程序行为的类

  • 关系对象图:

UML

Code

  • MainT
  1. public class MainT {
  2. public static void main(String[] args) {
  3. Display display=new StringDisplay("hello decorator");
  4. display.show();
  5. Display display1=new SideBorder(display,'#');
  6. display1.show();
  7. Display fullBorder = new FullBorder(display1);
  8. fullBorder.show();
  9. Display display2=new SideBorder(
  10. new FullBorder(
  11. new FullBorder(
  12. new SideBorder(
  13. new FullBorder(
  14. new StringDisplay("Lets it go")
  15. ),
  16. '*'
  17. )
  18. )
  19. )
  20. ,'/');
  21. display2.show();
  22. }
  23. }
  • Display
  1. public abstract class Display {
  2. // 获取横向字符数
  3. public abstract int getColumns();
  4. // 获取纵向行数
  5. public abstract int getRows();
  6. // 获取row行字符
  7. public abstract String getRowText(int row);
  8. // 显示
  9. public final void show(){
  10. for (int i = 0; i < getRows(); i++) {
  11. System.out.println(getRowText(i));
  12. }
  13. }
  14. }
  • StringDisplay

  1. public class StringDisplay extends Display {
  2. private String string;
  3. public StringDisplay(String string) {
  4. this.string = string;
  5. }
  6. @Override
  7. public int getColumns() {
  8. return string.getBytes().length;
  9. }
  10. @Override
  11. public int getRows() {
  12. return 1;
  13. }
  14. @Override
  15. public String getRowText(int row) {
  16. return row==0? string: null;
  17. }
  18. }
  • FullBorder
  1. public class FullBorder extends Border {
  2. public FullBorder(Display display) {
  3. super(display);
  4. }
  5. @Override
  6. public int getColumns() {
  7. return display.getColumns()+2;
  8. }
  9. @Override
  10. public int getRows() {
  11. return display.getRows()+2;
  12. }
  13. @Override
  14. public String getRowText(int row) {
  15. if(row==0)
  16. return "+"+makeLine("-",display.getColumns())+"+";
  17. else if(row==display.getRows()+1)
  18. return "+"+makeLine("-",display.getColumns())+"+";
  19. else
  20. return "|"+display.getRowText(row-1)+"|";
  21. }
  22. private String makeLine(String s, int columns) {
  23. StringBuffer buffer = new StringBuffer();
  24. for (int i = 0; i < columns; i++) {
  25. buffer.append(s);
  26. }
  27. return buffer.toString();
  28. }
  29. }
  • SideBorder
  1. public class SideBorder extends Border {
  2. private char aChar;
  3. public SideBorder(Display display,char ch) {
  4. super(display);
  5. this.aChar=ch;
  6. }
  7. @Override
  8. public int getColumns() {
  9. return display.getColumns()+2;
  10. }
  11. @Override
  12. public int getRows() {
  13. return display.getRows();
  14. }
  15. @Override
  16. public String getRowText(int row) {
  17. return aChar+display.getRowText(row)+aChar;
  18. }
  19. }

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. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

  2. ECMAScript中面向对象的程序设计思想总结

    <JavaScript高级程序设计>Chapter6笔记 1.ECMAScript内部值属性:数据属性和访问器属性 1)数据属性 数据属性的4个特性: configurable:表示能否通 ...

  3. Shiro 权限管理filterChainDefinitions过滤器配置

    博客转载:http://blog.csdn.net/userrefister/article/details/47807075 /** * Shiro-1.2.2内置的FilterChain * @s ...

  4. Poj 1973 Software Company(二分+并行DP)

    题意:软件公司接了两个项目,来自同一个合同,要一起交付.该公司有n个程序猿来做这两个项目A和B,每个项目都被分为m个子项目,给定每个程序猿做一个A中的子项目需要的时间Xi秒,和做B中的子项目所需时间Y ...

  5. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...

  6. 事务之五:Spring @Transactional工作原理

    本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的. JPA(Java Persistence API--java持久层)和事务管理 很重要的一点是JPA本身 ...

  7. maven spring3.2.5

    出现的情形: 开发环境: spring3.2.5 + springmvc +spirngDATA +maven 一. 偶然的spring Junit4测试 加载applicationContext.x ...

  8. Centos6.5_64位系统下安装Oracle 11g

    一.硬件要求 1.内存与Sweap:内存2G(以上),Sweap 2G(以上) 内存: 1-2G 2-16G 16G以上 Sweap: 1.5倍内存 1倍内存 16G 检查:# grep MemTot ...

  9. macOS 安装 Docker

    系统要求 Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite,或者 2010 年以后的 Mac 机型,准确说是带 Intel MMU 虚拟化的,最低 4GB 内 ...

  10. 杭电acm 1033题

    Problem Description For products that are wrapped in small packings it is necessary that the sheet o ...