装饰模式由四个角色组成:抽象组件角色,抽象装饰者角色,具体组件角色,具体装饰者角色

抽象组件角色:给出一个抽象接口,以规范“准备接受附加功能”的对象。

抽象装饰者角色:持有一个组件(Component)对象的引用,并定义一个与抽象组件接口一致的接口。

具体组件角色:定义一个准备接受附加功能的类。

抽象装饰者角色:负责给组件对象“贴上”附加的责任。

类图:

JAVA代码:

Conponent.java

package com.decorator;

public interface Component
{
void doSomeThing();
}

ConcreteConponent.java

package com.decorator;

public class ConcreteComponent implements Component
{ @Override
public void doSomeThing()
{
System.out.println("功能A");
} }

Decorator.java

package com.decorator;

public class Decorator implements Component
{
private Component component; //待修饰对象的一个引用 public Decorator(Component component)
{
this.component = component;
} @Override
public void doSomeThing()
{
this.component.doSomeThing();
} }

ConcreteDecorator1.java

package com.decorator;

public class ConcreteDecorator1 extends Decorator
{ public ConcreteDecorator1(Component component)
{
super(component);
} @Override
public void doSomeThing()
{
super.doSomeThing();
doAnotherThing();
} private void doAnotherThing()
{
System.out.println("功能B");
}
}

ConcreteDecorator2.java

package com.decorator;

public class ConcreteDecorator2 extends Decorator
{ public ConcreteDecorator2(Component component)
{
super(component);
} @Override
public void doSomeThing()
{
super.doSomeThing();
doAnotherThing();
} private void doAnotherThing()
{
System.out.println("功能C");
}
}

Test.java

package com.decorator;

public class Test
{
public static void main(String[] args)
{
//ConcreteDecorator1对象装饰了ConcreteComponent对象
//ConcreteDecorator2对象又修饰了ConcreteDecorator1对象
//在不增加一个同时拥有ConcreteComponent、ConcreteDecorator1和ConcreteDecorator2三个类的功能
//于一身的一个“新的类”的情况下,通过修饰,实现了同时拥有这些功能
Component component = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent())); component.doSomeThing();
} }

总结:

  装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,其可以在不创造更多子类的情况下将对象的功能加以扩展。

编程模式之装饰模式(Decorator)的更多相关文章

  1. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  2. 设计模式---单一职责模式之装饰模式(Decorator)

    前提:"单一职责"模式 在软件组件的设计中,如果责任划分的不清晰,使用继承,得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任 典型模式(表现 ...

  3. 装饰模式/decorator模式/结构型模式

    装饰模式Decorator 定义 为对象动态的增加新的功能,实现要求装饰对象和被装饰对象实现同一接口或抽象类,装饰对象持有被装饰对象的实例. java实现要点 定义一个接口或抽象类,作为被装饰者的抽象 ...

  4. 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)

    结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题.   结构 ...

  5. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...

  6. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  7. [工作中的设计模式]装饰模式decorator

    一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...

  8. 装饰模式decorator

    C++设计模式——装饰模式 前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会 ...

  9. 《JAVA设计模式》之装饰模式(Decorator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

随机推荐

  1. IE8下调用Active控件

    之前在IE6下运行正常的Active控件,浏览器升级到IE8后全部失效,并呈浏览器崩溃状. 网上搜了一圈得到如下解决方法: 1.设置信任站点 2.还需要在IE浏览器菜单 “工具>Internet ...

  2. Actionscript Flash Event.ENTER_FRAME 延迟间隔非常大 并且 pre-render 耗时非常严重

    我遇到的问题是代码中不断的添加一个图标到舞台上,而且这个图标非常小,所以从内存也看不出什么问题. 但是由于舞台物件太多了,并且不断添加,导致渲染耗时严重. 而且这种错误,开发工具并不会报错,也不属于死 ...

  3. Postgresql Jsonb字段内含数组属性的删除元素操作

    1.创建示例表 create temp table settings as select '{"west": [ {}, {} ]}'::jsonb as value; 2.如下保 ...

  4. C#中的继承

    按照我个人的理解,继承和实现接口不是一个概念,结构和类型都可以实现接口,枚举不能. 话说,结构可以继承吗? 先梳理一下C#中的继承关系,如下图: class => [BaseClass => ...

  5. Python基础篇【第6篇】: Python模块subprocess

    subprocess Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*         ...

  6. XE6 & IOS开发之开发者账号、苹果证书(2):关于苹果证书

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.关于苹果证书. 注意 ...

  7. BdAsyncTask学习

    综述 是什么 BdAsyncTask是仿照系统的AsyncTask重写的异步处理任务.用法和系统原生的AsyncTask一样,复写doInBackground.onPreExecute.onPostE ...

  8. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  9. 无需写try/catch,也能正常处理异常 (转)

    原文地址: http://www.cnblogs.com/artech/archive/2012/10/28/automatic-exception-handling-aspnet.html 对于企业 ...

  10. Python格式化字符串和转义字符

    地址:http://blog.chinaunix.net/uid-20794157-id-3038417.html Python格式化字符串的替代符以及含义     符   号     说     明 ...