Decorator模式(装饰模式)

标签: Decorator模式 设计模式
3人阅读 评论(0) 收藏 举报
分类:

Decorator模式:不断地为对象添加装饰的设计模式

示例:给文字添加装饰边框

Display抽象类:(Component)

public abstract class Display {
    public abstract int getColumns();               // 获取横向字符数
    public abstract int getRows();                  // 获取纵向行数
    public abstract String getRowText(int row);     // 获取第row行的字符串
    public void show() {                            // 全部显示
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }

}

StringDisplay具体构件:(ConcreteComponent)

public class StringDisplay extends Display {
    private String string;                          // 要显示的字符串
    public StringDisplay(String string) {           // 通过参数传入要显示的字符串
        this.string = string;
    }
    public int getColumns() {                       // 字符数
        return string.getBytes().length;
    }
    public int getRows() {                          // 行数是1
        return 1;
    }
    public String getRowText(int row) {             // 仅当row为0时返回值
        if (row == 0) {
            return string;
        } else {
            return null;
        }
    }

}

Border类:(Decorator抽象装饰类)

public abstract class Border extends Display {
    protected Display display;          // 表示被装饰物
    protected Border(Display display) { // 在生成实例时通过参数指定被装饰物
        this.display = display;
    }

}

SideBorder类:(ConcreteDecorator)

public class SideBorder extends Border {
    private char borderChar;                        // 表示装饰边框的字符
    public SideBorder(Display display, char ch) {   // 通过构造函数指定Display和装饰边框字符 
        super(display);
        this.borderChar = ch;
    }
    public int getColumns() {                       // 字符数为字符串字符数加上两侧边框字符数 
        return 1 + display.getColumns() + 1;
    }
    public int getRows() {                          // 行数即被装饰物的行数
        return display.getRows();
    }
    public String getRowText(int row) {             // 指定的那一行的字符串为被装饰物的字符串加上两侧的边框的字符 
        return borderChar + display.getRowText(row) + borderChar;
    }

}

Main:

public class Main {
    public static void main(String[] args) {
        Display b1 = new StringDisplay("Hello, world.");
        Display b2 = new SideBorder(b1, '#');
        Display b3 = new FullBorder(b2);
        b1.show();
        b2.show();
        b3.show();
        Display b4 = 
                    new SideBorder(
                        new FullBorder(
                            new FullBorder(
                                new SideBorder(
                                    new FullBorder(
                                        new StringDisplay("你好,世界。")
                                    ),
                                    '*'
                                )
                            )
                        ),
                        '/'
                    );
        b4.show();
    }

}

Component增加功能时的核心角色,定义核心角色的接口
ConcreteComponent实现Component角色所定义的接口
DecoratorComponent角色具有相同的接口
ConcreteDecorator具体的Decorator角色


查看评论

PHP+Javascript液晶时钟

作者:caocao   发表日期:2000年12月20日   阅读次数:126  $size_small=5;//液晶宽度   $size_big=25;//液晶长度   $distance=10;/...
  • terrywang
  • terrywang
  • 2000-12-21 23:24:00
  • 521

Java与模式之装饰(Decorator)模式

装饰(Decorator)模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。     装饰模式以对客户透明的方式动态地给一个对象附加上更多的...
  • hintcnuie
  • hintcnuie
  • 2016-12-29 13:36:14
  • 681

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014-08-18 20:23:19
  • 20008

设计模式之八 --- 装饰模式(Decorator)

【1】基本概念           装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 【2】简单分析           我们先来...
  • cjjky
  • cjjky
  • 2012-04-19 20:12:35
  • 14550

c++设计模式----Decorator(装饰)

装饰模式: 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。  适用性:            在不影响其他对象的情况下,以动态、...
  • chenxun2009
  • chenxun2009
  • 2015-09-17 23:12:45
  • 739

浅谈JAVA设计模式之——装饰模式(Decorator)

一、概述 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、适用性 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处...
  • l1028386804
  • l1028386804
  • 2015-05-03 23:56:03
  • 2395

iOS 设计模式之装饰模式(Decorator)

给一个人穿上衣服,使用装饰者模式给一个人穿上衣服,首先要定义一个 Person 类。 Person 有一个 name,还可以展示自己穿了什么。//Person.h @interface Perso...
  • a12a33
  • a12a33
  • 2016-02-17 13:38:13
  • 1058

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2...
  • u012515223
  • u012515223
  • 2014-05-23 16:18:32
  • 2715

装饰模式(Decorator)与代理模式(Proxy)的区别与联系

学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是 找了很多资料,想弄清楚这两者之间到底有什么区别。结果发...
  • small_june
  • small_june
  • 2014-06-05 15:38:01
  • 1038

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继...
  • l416112167
  • l416112167
  • 2015-03-09 21:07:56
  • 2161
    个人资料
    等级:
    访问量: 1601
    积分: 278
    排名: 28万+
    文章存档