`

装饰者模式

阅读更多

从毛胚房的装修说起

每个人拿到属于自己的毛胚房时都兴奋不已,左看看右量量,筹划着装修的桩桩件件,憧憬着未来的幸福家园。每个人都希望装修完全按照自己的设想走,无论风格还是造价预算。可是装修这个活并不好干,同样的毛胚房有很多种装修方案,装修过程中也不可避免发生计划不如变化快的情形,往往最终的效果和最初的设想并不一致,这就是生活的实际。

软件开发的某个阶段和装修房子像极了!系统的基本功能实现后(原型跑起来),相当于毛胚房建造完成,界面不美观,功能也不够完善,毛胚嘛!在接下来的软件“装修”过程中,Decorator 模式将发挥重大的作用。众所周知,我们实施房屋装修工程有两个基本条件和约束:第一,必须有个毛胚房,否则还装修什么啊!第二,不能拆除承重结构。软件的装修也是如此,基本功能和流程框架不会做大的改动,否则还不如推倒重来了。Decorator 设计模式正如房屋的装修,是在毛胚房的基础上层层 wrapper(包装),先刷刷墙面漆,再铺铺木地板,再购置家具布置一下等等。这一道道的装修工序,可以看作是对毛胚房层层包装,最后的装修效果,甚至让你忘记了毛胚房的样子!因此,Decorator 设计模式也被称为 Wrapper 设计模式。

 

Decorator 设计模式的特点

Decorator 设计模式正如毛胚房的装修,不会改变原毛胚房的基本框架,只是增加新的外观、功能等,且随着时间的推移,可以不断的实施装修工程:增加新的家具、根据心情换换新鲜的墙纸等等。在面向对象的程序设计中,扩展系统的原有功能也可以采用继承、组合的方式。继承也不会改变毛胚房(父类),但是由于装修工程的复杂和很多不可预测的改变,比如不同墙纸和地板样式的组合数量简直无法想想,难道我们要为每一种组合都定义一个子类吗?显然这是不现实的,即通过继承的方式来应对未来的功能和外观改变通常是吃力不讨好的事情。组合的方式也不可取,因为这要求不断的修改父类的结构,相当于对毛胚房大动干戈,房屋的可维护性和可靠性就大大降低了。

让我们回顾一下设计模式的重要原则:Classes should be open for extenstion, but closed for modification。Decorator 设计模式很好的诠释了这个原则。

Decorator 设计模式的 Java 实例

以房屋装修为例,依据 Decorator 设计模式的原则设计类图如下:



 
Room.java 是房屋的接口类,定义了房子的基本功能:

public interface Room {
    public String showRoom();
}

 BlankRoom.java 就是毛胚房了。毛胚房也是房子啊,因此实现了 Room 接口的基本功能:

// 毛胚房,这是我们装修工程的基础
public class BlankRoom implements Room {

    @Override
    public String showRoom() {
        return "毛胚房";
    }
}

 RoomDecorator 是所有 Decorator 类的父类,由于 RoomDecorator 通常不实现具体功能,因此设计为抽象类。

// 装修工程的模板
abstract public class RoomDecorator implements Room {
 // wrapper 的具体体现,每个独立的装修工序都是在上一个装修工序

 // 的基础上进行的,装修就是这样层层包装完成的
 protected Room roomToBeDecorated;

 public RoomDecorator(Room roomToBeDecorated) {
     this.roomToBeDecorated = roomToBeDecorated;
 }

 @Override
 public String showRoom() {
     // 委托(delegate)
     return roomToBeDecorated.showRoom();
 }
}

 PaintedDecorator 类是 RoomDecorator 的子类,实现了房屋粉刷功能:

public class PaintedDecorator extends RoomDecorator {

 public PaintedDecorator(Room roomToBeDecorated) {
 super(roomToBeDecorated);
 }

 public String showRoom(){
 doPainting();
 return super.showRoom() + "刷墙漆"; 
 }

 // 刷墙漆
 private void doPainting(){}

}

 FlooredDecorator 类是 RoomDecorator 的子类,实现了铺地板的功能:

public class FlooredDecorator extends RoomDecorator {
 public FlooredDecorator(Room roomToBeDecorated) {
 super(roomToBeDecorated);
 }


 public String showRoom(){
 doFlooring();
 return super.showRoom() + "铺地板";
 }

 // 铺地板
 private void doFlooring(){}
}

 最后,写一个测试类,

public class TestClient {
 public static void main(String[] args) {
 // 毛胚房
 Room blankRoom = new BlankRoom(); 

 // 刷了墙的毛胚房
 Room paintedRoom = new PaintedDecorator(new BlankRoom()); 

 // 先刷墙再铺地板的毛胚房
 // 注意到连续的 new 操作,这就是 wrapper,最内层的一般是毛胚房
 Room paintedAndFlooredRoom = new FlooredDecorator(new 
PaintedDecorator(new BlankRoom()));

 // 先铺地板再刷墙的毛胚房
 Room flooredAndPaintedRoom = new PaintedDecorator(new 
FlooredDecorator(new BlankRoom()));

 System.out.println(blankRoom.showRoom());
 System.out.println(paintedRoom.showRoom());
 System.out.println(paintedAndFlooredRoom.showRoom());
 System.out.println(flooredAndPaintedRoom.showRoom());
 }

}

 执行结果:



 本文来于:http://www.ibm.com/developerworks/cn/java/j-lo-cdi-decorator-pattern/

  • 大小: 51.9 KB
  • 大小: 10.2 KB
4
7
分享到:
评论

相关推荐

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    装饰者模式Android实例

    装饰者模式是设计模式的一种,属于结构型模式,它的主要目的是动态地给对象添加新的行为或职责,而无需改变对象的原始代码。在Android开发中,装饰者模式的应用相当广泛,尤其是在视图组件的扩展和功能增强上。下面...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    java装饰者模式实现

    装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责,而不必修改原有代码,遵循“开闭原则”。在Java中,装饰者模式通常通过继承和组合来实现,尤其适用于那些...

    c# ,设计模式,装饰者模式,星巴兹咖啡

    装饰者模式是面向对象设计模式中的一个重要概念,它在C#等编程语言中广泛应用。这个例子以星巴克咖啡为例,展示了如何使用装饰者模式来灵活地扩展对象的功能,而无需修改原有代码。 装饰者模式的核心思想是动态地将...

    设计模式的装饰者模式的例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们可以在不改变对象原有结构的情况下,通过...

    Qt设计模式之装饰者模式

    **Qt设计模式之装饰者模式** 装饰者模式(Decorator Pattern)是软件设计模式中的结构型模式之一,它允许在运行时动态地给一个对象添加新的行为或职责,而无需修改对象本身。在Qt库中,装饰者模式也被广泛应用,...

    装饰者模式 C++ 实现

    装饰者模式是一种设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改对象本身的代码。在C++中实现装饰者模式,我们可以遵循以下步骤和关键概念: 1. **定义接口**:首先,我们需要定义一个基础...

    装饰者模式demo

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们的系统更加灵活,易于维护和扩展。 装饰...

    装饰者模式案例学习代码

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为和职责。这种模式在软件工程中广泛应用,因为它提供了一种灵活的方式来扩展对象的功能,而不会破坏其原有的结构。在Java、...

    装饰者模式的典型应用。

    装饰者模式是设计模式中的一种结构型模式,它在不改变对象原有行为的基础上,动态地为对象添加新的功能。这种模式常被用于扩展或增强对象的功能,而无需修改原对象的代码,符合“开闭原则”。在Java的SSL(Secure ...

    Headfirst(三)装饰者模式C++实现

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式在C++中的应用尤为广泛,因为它提供了灵活性,能够扩展对象的功能,同时保持代码的可读性和可维护性。 ...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    装饰者模式代码demo

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过将对象包装在一个装饰类中来实现,装饰类与原类有相同的接口,因此可以透明地替换或增强原有对象的...

    游戏设计3-装饰者模式-装备

    装饰者模式是面向对象设计中的一种行为设计模式,它允许在运行时动态地给对象添加新的职责或行为,而无需改变对象本身。在游戏设计中,装饰者模式常常被用来扩展角色、装备等对象的功能,使得游戏内容更加丰富且易于...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    设计模式之装饰者模式,内含可运行代码

    装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...

Global site tag (gtag.js) - Google Analytics