`

java设计模式--[结构模式]--装饰者模式[decorator pattern]

阅读更多

一. 裝飾者模式

裝飾者模式,又叫包裝器,動態地給動象添加一些額外的職責,若要擴展功能,裝飾者指供了比繼承更有彈性的替代方案.

 

二. 裝飾者模式的UML類圖如下:
    

 

三. 本節內容以一個點餐配菜的案例來說明裝飾者模式的用法,完整代碼如下:

 

1.  主食類超類:

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: StapleFood 
 * @Description:主食類[抽象組件]
 * @author Liyongbin
 * @date 2011-2-7 下午09:43:39 
 * @version V1.0
 */
public abstract class StapleFood {
	private String description ="Unknown StapleFood";
	/**
	 * 主食的描述[主食名稱]
	 * @return
	 */
	public String getDescription(){
		return description;
	}
	
	/**
	 * 主食的價格
	 * @return
	 */
	public abstract double cost();
}

 

2. 菜類的超類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Dish 
 * @Description: 菜類
 * @author Liyongbin
 * @date 2011-2-7 下午09:53:11 
 * @version V1.0
 */
public abstract class Dish extends StapleFood {
	
	//繼承了主食類的描述[菜的名字]
	public abstract String getDescription() ;
}

 

3. 主食類的派生類_米飯類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Rice 
 * @Description: 米飯_主食_具體組件
 * @author Liyongbin
 * @date 2011-2-7 下午09:56:26 
 * @version V1.0
 */
public class Rice extends StapleFood {

	@Override
	public String getDescription() {
		return "泰國香米";
	}
	
	@Override
	public double cost() {
		return 5.0;
	}
}

 

4. 主食類的派生類_面食類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: Rice 
 * @Description: 面飯_主食_具體組件
 * @author Liyongbin
 * @date 2011-2-7 下午09:56:26 
 * @version V1.0
 */
public class Noodle extends StapleFood {

	@Override
	public String getDescription() {
		return "面飯";
	}
	
	@Override
	public double cost() {
		return 4.0;
	}
}

 

5. 菜類的派生類: 雞肉

package structuralPattern.decorator.decorator2;

public class Chicken extends Dish {
	//
	private StapleFood stapleFood;

	//
	public Chicken(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	////主食的名稱+雞肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",辣子雞";
	}

	//主食的價格+雞肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+12.0d ;
	}
}

 

6. 菜類的派生類: 魚肉

package structuralPattern.decorator.decorator2;

public class Fish extends Dish {
	//
	StapleFood stapleFood;

	//
	public Fish(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	////主食的名稱+魚肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",烏江魚";
	}

	//主食的價格+魚肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+10.0d ;
	}
}

 

7. 菜類的派生類: 鴨肉

package structuralPattern.decorator.decorator2;

public class PekingDuck extends Dish {
	//
	StapleFood stapleFood;

	//
	public PekingDuck(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}

	////主食的名稱+鴨肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",北京烤鴨";
	}

	//主食的價格+鴨肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+25.0d ;
	}
}

  

 8. 菜類的派生類: 羊肉

package structuralPattern.decorator.decorator2;

public class Mutton extends Dish {
	//
	StapleFood stapleFood;
	//
	public Mutton(StapleFood stapleFood) {
		this.stapleFood = stapleFood;
	}
	//主食的名稱+羊肉的名稱
	@Override
	public String getDescription() {
		return stapleFood.getDescription() + ",小肥羊";
	}
	//主食的價格+羊肉的價格
	@Override
	public double cost() {
		return stapleFood.cost()+30.0d ;
	}
}

 

 9. 點餐測試類

package structuralPattern.decorator.decorator2;
/**
 * @ClassName: DecoratorTest 
 * @Description:點餐測試
 * @author Liyongbin
 * @date 2011-2-7 下午09:12:46 
 * @version V1.0
 */
public class DecoratorTest {
	public static void main(String[] args) {
		//無菜面飯[¥4]
		StapleFood noodle0 = new Noodle();
		System.out.println(noodle0.getDescription()+" ¥"+noodle0.cost());
		
		//帶菜(雞肉[¥12],魚肉[¥10])面飯[¥4]
		StapleFood noodle1 = new Noodle();
		noodle1=new Chicken(noodle1);
		noodle1=new Fish(noodle1);
		System.out.println(noodle1.getDescription()+" ¥"+noodle1.cost());
		
		//無菜的米飯[¥5]
		StapleFood rice0 = new Rice();
		System.out.println(rice0.getDescription()+" ¥"+rice0.cost());
		
		//帶菜(雞肉[¥12],魚肉[¥10],羊肉[¥30],鴨肉[¥25])的米飯[¥5]
		StapleFood rice1 = new Rice();
		rice1=new Chicken(rice1);
		rice1=new Fish(rice1);
		rice1=new Mutton(rice1);
		rice1=new PekingDuck(rice1);
		System.out.println(rice1.getDescription()+" ¥"+rice1.cost());
	}
}

 

 10. 運行結果如下:


   

  • 大小: 27.9 KB
  • 大小: 8.6 KB
分享到:
评论

相关推荐

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

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

    JAVA设计模式-chm版

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

    JAVA design pattern-java设计模式

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

    design-pattern-java.pdf

    树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...

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

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

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

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

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

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

    java-design-patterns-master_JAVAdesignpattens_java_design_

    《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...

    java Decorator装饰模式例子

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

    design-pattern-Java设计模式

    在Java设计模式中,主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),...

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

    通过系统地学习本书内容,无论是初学者还是有经验的程序员都能够获得对Java设计模式更深层次的理解,并能够在实际工作中灵活运用这些模式解决问题。此外,书中提供的实践案例和代码示例也是宝贵的资源,有助于开发者...

    java设计模式ppt

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

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

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

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

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

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

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

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...

    Design Pattern - Decorator

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

    Java设计模式之禅

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

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

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

Global site tag (gtag.js) - Google Analytics