结构型模式之装饰

装饰(Decorator)模式是对象结构模式,GOF对它的作用描述为:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活。现在直接给出GOF著作中的Decorator模式结构图:

实现案例是学习设计模式的好办法,GOF一书中给了一个例子,就是“图形用户界面”设计的问题,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。 可以使用继承实现,但方法太过死板,因为通过继承实现的边框,它的选择是静态的,用户不能控制对组件加边框的方式和时机。记住:继承是强关联关系。较为灵活的办法是将组件放到一个对象中,由这个对象为组件添加边框。而这个嵌入的对象就是装饰。类图如下图:

由给定的类图结构,设计以下相应的代码,如下:

 1 abstract class VisualComponent{
 2     public VisualComponent(){};
 3     abstract void Draw();
 4     abstract void Resize();
 5 }
 6 abstract class Decorator extends VisualComponent{
 7     private VisualComponent v;
 8     public Decorator(VisualComponent v){this.v=v;};
 9     void Draw(){v.Draw();};
10     void Resize(){v.Resize();};
11 }
12 class TextView extends VisualComponent{
13     public TextView(){};
14     public void Draw(){
15         System.out.println("Draw a TextView");
16     }
17     public void Resize(){
18         System.out.println("Reset the text‘s size");
19     }
20 }
21 class BorderDecorator extends Decorator{
22     private int width;
23     public BorderDecorator(VisualComponent v,int width){
24         super(v);
25         this.width=width;
26     }
27     private void DrawBorder(int width){
28         System.out.println("Decorate it with a line whose width is "+width);
29     }
30     public void Draw(){
31         super.Draw();
32         DrawBorder(width);
33     }
34 }
35
36 public class Test{
37
38     public static void main(String[] args){
39
40         new BorderDecorator(new TextView(),10).Draw();
41     }
42 }

装饰模式典型的创建对象的过程如下代码所示。

1 new Decorator1(
2             new Decorator2(
3                 new Decorator3(
4                     new ConcreteComponent()
5                     )
6                 )
7             );

使用装饰模式要注意以下几点:

1、接口的一致性。装饰对象必须和它所装饰的Component的接口要一致,组件类和装饰类必须有一个公共的父类。

2、保持Component类的简单性。Component应集中定义接口(也就是方法),而不是用于存储数据,应该把数据的定义延迟到子类中。

时间: 2024-12-25 07:15:28

结构型模式之装饰的相关文章

结构型模式之装饰者模式

GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq 一.定义 装饰者模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活.其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合.根据翻译的不同,装饰模式也有人称之为"油漆工模式&quo

结构型模式 装饰模式

结构型模式 装饰模式 适用于:  装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责.就增加功能来说,此模式比生成子类更为灵活. /** * 结构型模式 装饰模式 * 装饰( Decorator )模式又叫做包装模式. * 通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. * 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地.按顺序地使用装饰功能包装对象. * */ #defi

设计模式之结构型模式(三)

结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性. 结构型模式分为以下 7 种: 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问.即客户端通过代理间接地访问该对象,从而限制.增强或修改该对象的一些特性. 适配器(Adapter)模式:将一个类的接口转换成客户希望的

设计模式(十):Decorator装饰者模式 -- 结构型模式

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

设计模式之十四:Decorator(装饰)—对象结构型模式

2014-06-15 星期日 10:42:12  Decorator,继续GOF. 1.Intent Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality 动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活. 2.A

设计模式之“结构型模式”(一)

结构型模式主要分为七大模式,分别为:适配器模式.桥接模式.组合模式.装饰模式:.外观模式.享元模式.代理模式. 适配器模式 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 一.适用时期 1.适用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑适用适配器. 2.两个类所做的事情相同或相似,但是具有不同的接口时要使用它. 3.在双方都不太容易修改的时候再使用适配器模式适配. 二.DataAdapt

7 结构型模式之 - 装饰模式

装饰模式介绍:装饰模式也称为包装模式,是结构型模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,充其量只是在外面披上一层包装而已,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的. 装饰模式的定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

设计模式之结构型模式

设计模式被分成了三大类型:创建型.结构型和行为型.本文介绍一下结构型模式. 结构型模式包括适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式和代理模式. 适配器模式:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用:系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 桥接模式:将