`
kingbinchow
  • 浏览: 124792 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java设计模式之--装饰模式Decorator Pattern

阅读更多
首先,当我们遇到什么样的问题时,我们要用Decorator解决呢?

  例如,生活中身边最常见的水杯,不仅有不同大小,而且有不同颜色等,我们按继承的做法:
图画的难看了,大家将就一下,咱也不是美工出身 O(∩_∩)O~


abstract class Cup{
    abstract void volume();
}


interface Color{
	void color();
}

//实体类Code
class Cup300ml extends Cup {
    public void volume(){
    	System.out.print("300ml cup");
    }
}
class Cup500ml extends Cup{
	public void volume(){
		System.out.print("500ml cup");
	}
}
class Cup700ml extends Cup{
	public void volume(){
		System.out.print("700ml cup");
	}
}

//各种颜色的添加
class Cup300mlRed extends Cup300ml implements Color{

	@Override
	public void color() {
		System.out.print("red color");
	}
	
}
class Cup500mlRed extends Cup300ml implements Color{
	
	@Override
	public void color() {
		System.out.print("red color");
	}
}
class Cup700mlRed extends Cup300ml implements Color{
	
	@Override
	public void color() {
		System.out.print("red color");
	}
}
class Cup300mlYellow extends Cup300ml implements Color{
	
	@Override
	public void color() {
		System.out.print("yellow color");
	}
}


不难发现,子类会成级数增长。

Question:问题的所在就是:
  我们“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态物质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能组合)会导致更多子类的膨胀。

Solution:采用装饰模式:
  动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
                                      ------《设计模式》GOF


  装饰模式的 结构图:




具体代码实现:
abstract class Cup{
    abstract void volume();
}

//模式结构图中的Component
interface Color{
	void color();
}

//模式结构图中的ConcreteComponent
class Red implements Color{

	@Override
	public void color() {
		System.out.print("red color");
	}
	
}
class Yellow implements Color{
	
	@Override
	public void color() {
		System.out.print("yellow color");
	}
	
}

//模式结构图中的Decorator
class Cup300ml extends Cup {
    
   //在类里面,添加组合接口类Color,作为私有成员
    private Color mColor;

    public void volume(){
    	System.out.print("300ml cup ");
         mColor.color();
    }
    //在构造器中,将组合成员以参数形式传入
    public Cup300ml(Color c){
    	mColor = c;
    }
}
class Cup500ml extends Cup{
    private Color mColor;
    public void volume(){
    	System.out.print("500ml cup ");
         mColor.color();
    }
    public Cup500ml(Color c){
    	mColor = c;
    }
}
class Cup700ml extends Cup{
    private Color mColor;
    public void volume(){
    	System.out.print("700ml cup ");
         mColor.color();
    }
    public Cup700ml(Color c){
    	mColor = c;
    }
}



Test:测试:
 
public class Test{

    public static void main(String a[]){
	Red red = new Red();
	Yellow yellow = new Yellow();
	Cup300ml cup300 = new Cup300ml(red);
	Cup500ml cup500 = new Cup500ml(yellow);
	cup300.volume();
	cup500.volume();
    }
}


总结:
Decorator Pattern就如生活中的壁画一般:
 
适用性:
    需要扩展一个类的功能,或给一个类增加附加责任。
    需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
    需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

  通过采用组合、而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差"和"多子类衍生问题"。

 
  • 大小: 46.7 KB
  • 大小: 51.1 KB
  • 大小: 14.3 KB
分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    java常用设计模式-装饰器模式

    装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或删除对象的功能时,或者当您想...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    java 设计模式 源码 欢迎访问DesignPattern项目 ...装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    design-pattern-Java设计模式

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和标准解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,让开发者能够更好地理解和交流复杂的系统架构。这些...

    java设计模式ppt

    ### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...

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

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    Design Pattern - Decorator

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

    JAVA 23种设计模式(全).Design Pattern_Java模式

    总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...

Global site tag (gtag.js) - Google Analytics