设计模式(9)-结构型-装饰模式(Decorator)

来源:互联网 发布:达梦数据库6.0下载 编辑:程序博客网 时间:2024/06/06 08:39

概述

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。可以简称为"修修补补"


适用性

  • 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 2.处理那些可以撤消的职责。
  • 3.当不能采用生成子类的方法进行扩充时。

参与者

  • 1.Component 定义一个对象接口,可以给这些对象动态地添加职责。
  • 2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
  • 3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
  • 4.ConcreteDecorator 向组件添加职责。

其基本类图如下图所示:


示例:


package com.sql9.structured;abstract class Component {public abstract void draw();}class ConcreteComponent extends Component {private String name;public ConcreteComponent(String name) {this.name = name;}@Overridepublic void draw() {System.out.println(String.format("ConcreteComponent - %s", name));}}abstract class Decorator extends Component {protected Component internalComponent;public void setComponent(Component c) {this.internalComponent = c;}@Overridepublic void draw() {if (internalComponent != null) {internalComponent.draw();}}}class ConcreteDecorator extends Decorator {private String customName;public ConcreteDecorator(String name) {this.customName = name;}@Overridepublic void draw() {extraDraw();super.draw();}protected void extraDraw() {System.out.println("Draw extra action in ConcreteDecorator...");}}public class DecoratorTest {public static void main(String[] args) {ConcreteComponent c = new ConcreteComponent("This is the real component");ConcreteDecorator d = new ConcreteDecorator("This is a decorator for the component");d.setComponent(c);d.draw();}}

结果:


Draw extra action in ConcreteDecorator...
ConcreteComponent - This is the real component

<script type="text/javascript"><!--google_ad_client = "ca-pub-7104628658411459";/* wide1 */google_ad_slot = "8564482570";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击