`

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...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式的特点 3. 装饰器模式的UML类图和基本结构 3.1 UML...

    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种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

Global site tag (gtag.js) - Google Analytics