`
flyingis
  • 浏览: 296642 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Design Pattern] The Decorator Pattern

阅读更多
    作者:Flyingis

    按照常理,还是先阐述基本概念,Decorator Pattern可以用即时战略游戏中兵种的装甲强度来理解,举一个典型的例子,魔兽争霸(或冰峰王座等)中山丘是个非常厉害的角色了,经常能够一锤击毙敌人的英雄和士兵,因此被誉为英雄杀手。既然是英雄杀手,时常需要冲锋陷阵,在作战过程中自然会面临敌人的围攻,此时我们有多种方式来提升山丘的抗击打能力,一种是升级他的护甲,一种是通过魔法师给他施加增加防护的魔法,一种是等级到6时使用终极魔法来大幅度提高装甲的防护,还有一种就是使用无敌的魔法瓶,在规定时间内谁都拿他没辙,等等。虽然我不知道暴雪公司的工程师具体是如何实现这种功能设计的,但绝对不会是准备多个具有不同防御等级的山丘对象来供程序调用,如Shanqiu1、Shanqiu2……ShanqiuN,这样设计笨拙,代码繁多,如果游戏中其他兵种的装甲、攻击力的设计都是如此,那即使是天才团队也会天天在上帝面前祷告的。

    Decorator Pattern在这种情况下就可以发挥作用了,在普通装甲升级时,使用普通的装甲升级的装饰器,在使用终极魔法时,使用终极魔法装甲升级的装饰器。

public abstract class Soldier {
  String info 
= "Soldier's name:";
  
public String getInfo() {
    
return info;
  }

  
public abstract int armor();
}


public abstract class SoldierDecorator extends Soldier {
  
public abstract String getInfo();
}


public class NormalArmorUpdate extends SoldierDecorator {
  Soldier soldier;
  
public NormalArmorUpdate(Soldier soldier) {
    
this.soldier = soldier;
  }


  
public String getInfo() {
    
return soldier.getInfo() + "Shanqiu normal update!";
  }


  
public int armor() {
    
return soldier.armor() + 1;
  }

}


public class MagicArmorUpdate extends SoldierDecorator {
  Soldier soldier;
  
public MagicArmorUpdate(Soldier soldier) {
    
this.soldier = soldier;
  }

  
public String getInfo() {
    
return soldier.getInfo() + "Shanqiu magic update!";
  }


  
public int armor() {
    
return soldier.armor() + 5;
  }

}


public class Shanqiu extend Soldier {
  
public int armor() {
    
// 初始装甲厚度
    return 3;
  }

}


public class PlayingGame {
  
public static void main(String args[]) {
    Soldier soldier 
= new Shanqiu();
    System.out.println(
"Initialized armor:" + soldier.armor());

    
// 普通装甲升级
    soldier = new NormalArmorUpdate(soldier);
    System.out.println(
"Initialized armor:" + soldier.armor());

    
//  使用终极魔法后装甲升级
    soldier = new MagicArmorUpdate(soldier);
    System.out.println(
"Initialized armor:" + soldier.armor());
  }

}


    这样就避免了建立多个Shanqiu类来描述他的不同状态,终极魔法时间过去后,还可以增加一个Decorator来减去相应的装甲厚度,给编程带来了方便。

    Decorator Pattern设计的目的,是为了能够在运行时而不是编译期来动态改变对象的状态,使用组合的方式来增减Decorator,而不是去修改原有的代码来满足业务的需要,这样利于程序的扩展。当然,在Java中使用接口同样能够轻便的实现文中描述的业务需要,但哪种更好,哪种更优?

    Java中的IO提供了大量Decorator Pattern设计的实例,在笔者很久的一篇随笔中对此进行了简单介绍,建议还是看看JDK的帮助文档。

    参考资料:《Head First Design Pattern》
分享到:
评论

相关推荐

    Design Pattern - Decorator

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,同时保持对象的接口不变。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包装在一个装饰类中来扩展...

    design pattern

    在给定的压缩包文件中,包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式...

    Design*Pattern*Framework*4.5

    "Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    设计模式源码Head_First_DesignPattern_src

    在本文中,我们将深入探讨设计模式的核心概念,并结合"Head First DesignPattern_src"中的源码,详细解析一些关键的设计模式。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在...

    the code of Design Pattern

    在“designpattern”这个压缩包中,可能包含了各种设计模式的C++实现。比如,单例模式通常用来保证一个类只有一个实例,并提供全局访问点;工厂方法模式则允许子类决定实例化哪一个类,提供了一种封装对象创建过程的...

    Head First Design Pattern

    2. 结构型设计模式:包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式关注如何将类和...

    design pattern tutorial

    10. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。它提供了一种灵活的扩展一个对象功能的方式,而不需要使用继承。 11. 外观模式(Facade Pattern):提供了一个统一的接口,用来访问子...

    designpattern.zip

    本资源"designpattern.zip"包含了对Java中23种经典设计模式的详细讲解和代码实例,对于中高级Java工程师来说,是提升开发技能的必备学习材料。 设计模式通常分为创建型、结构型和行为型三大类。创建型设计模式关注...

    Software Architecture Design Pattern In Java

    3. **装饰器模式(Decorator Pattern)**: - 定义:动态地给一个对象添加一些额外的职责。 - 应用场景:可以用来扩展功能而不改变原有类的结构,如网络通信中的数据加密解密。 4. **观察者模式(Observer ...

    JAVA software design pattern

    7. **装饰器模式(Decorator)**:动态地给对象添加一些额外的职责,提供一种比继承更灵活的方式来扩展功能。 8. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。常用于远程代理、虚拟代理...

    DesignPattern.zip

    "DesignPattern.zip"这个压缩包包含了使用C++语言实现的设计模式源代码,适合在Visual Studio 2017环境下编译运行,并且能够方便地移植到Linux平台。下面将对设计模式及其在C++中的应用进行详细阐述。 1. **单例...

    design pattern中文版

    "Design Pattern中文版" 提供的是这些经典设计模式的中文解释,使得中国的开发者能够更方便地理解和应用这些模式。这份资料的描述指出字迹清晰,意味着阅读体验良好,适合深入学习。 PDF格式是一种广泛使用的文档...

    Professional ASP.NET Design Pattern 源代码

    《Professional ASP.NET Design Pattern》是一本深入探讨ASP.NET开发中设计模式的专业书籍,源代码的提供使得读者能够更直观地理解和应用这些设计模式。源代码的分章节组织(如c07到c14)表明内容可能按照书中的章节...

    design pattern PPT

    设计模式(Design Pattern)是软件工程中用于解决软件设计问题的既定方案。设计模式并非直接的代码实现,而是一套被验证过的通用解决方案模板。它们是由经验丰富的软件开发者总结出的,在特定上下文中对常见问题的...

    Gof design pattern 中文/英文版+web+学习笔记

    7. **装饰器模式(Decorator)**:动态地给一个对象添加一些额外的职责。装饰器模式允许在运行时为对象添加新功能,同时保持接口不变。 8. **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口。...

    Swift DesignPattern

    本资料"Swift DesignPattern"包含了一些Swift语言中的常见设计模式实例,下面我们将详细探讨这些设计模式及其在Swift中的应用。 1. **单例模式(Singleton)**:单例模式确保一个类只有一个实例,并提供全局访问点...

    DesignPattern.rar

    "DesignPattern.rar"这个压缩包包含的13种设计模式如下: 1. **适配器模式(Adapter Pattern)**:适配器模式主要用于解决不同接口之间不兼容的问题。通过创建一个适配器类,将原有接口转换为客户期望的接口,使得...

Global site tag (gtag.js) - Google Analytics