一. 裝飾者模式
裝飾者模式,又叫包裝器,動態地給動象添加一些額外的職責,若要擴展功能,裝飾者指供了比繼承更有彈性的替代方案.
二. 裝飾者模式的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. 運行結果如下:
相关推荐
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。
树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或删除对象的功能时,或者当您想...
装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...
《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
在Java设计模式中,主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),...
通过系统地学习本书内容,无论是初学者还是有经验的程序员都能够获得对Java设计模式更深层次的理解,并能够在实际工作中灵活运用这些模式解决问题。此外,书中提供的实践案例和代码示例也是宝贵的资源,有助于开发者...
### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...
Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...
这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...
这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...
Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,同时保持对象的接口不变。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包装在一个装饰类中来扩展...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...