装饰者模式:动态地将责任附加到对象上,若到扩展功能,装饰者提供了比继承更有弹性的替代方案。
UML图
有这样一个需求,咖啡店出售各式咖啡,如深焙、低卡、摩卡等,也有各种调料,如牛奶、奶泡等。
咖啡店需要根据咖啡中所放入的不同调料收取不同的费用。用装饰者模式来实现
定义一个抽象组件
package com.headfirst.chapter3;
/**
* 定义了一个抽象类,用于表示组件,它定义了一个抽象方法cost
*/
public abstract class Beverage {
String description;
public String getDescription() {
return description;
}
public abstract double cost();//计费方法
}
下面两个是具体组件,也就是被装饰者
1,深焙咖啡
package com.headfirst.chapter3;
public class DarkRoast extends Beverage {//深焙咖啡
public DarkRoast() {
this.description = "DarkRoast";
}
public double cost() {
return 0.89;
}
}
2,混合咖啡
package com.headfirst.chapter3;
public class HouseBlend extends Beverage {
public HouseBlend() {
this.description = "HouseBlend";
}
public double cost() {
return 1.89;
}
}
装饰者
这里定义了一个抽象方法getDescription,那么子类必须它来增加描述
如Houseblend Milk
package com.headfirst.chapter3;
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
下面两个是装饰者
package com.headfirst.chapter3;
public class Milk extends CondimentDecorator {
private Beverage beverage;//这个引用指向被装饰者
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + " Milk";
}
public double cost() {
return beverage.cost() + 0.20;
}
}
package com.headfirst.chapter3;
public class Mocha extends Beverage {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + " Mocha";
}
public double cost() {
return beverage.cost()+0.59;
}
}
测试类:
package com.headfirst.chapter3;
public class Test {
public static void main(String[] args) {
Beverage darkRoast = new DarkRoast();
darkRoast = new Mocha(darkRoast);
darkRoast = new Milk(darkRoast);
System.out.println(darkRoast.getDescription()+" $"+darkRoast.cost());
}
}
最后打印出:DarkRoast Mocha Milk $1.68
设计原则:类应该向修改关闭,向扩展开放
类的继承是扩展开幕式之一,但不见得是达到弹性设计的最佳方式。如果依赖继承,那么类的行为只能在编译时静态决定。
反之,利用组合,可以把装饰者混合着用,而且是在运行时。
分享到:
相关推荐
《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...
《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特且易于理解的方式介绍了设计模式这一复杂的概念。设计模式是软件开发中的经验总结,是解决常见问题的有效模板,可以帮助我们编写更灵活、可维护和可...
《Head-First设计模式》是一本面向初学者的优秀设计模式教程,主要针对Java编程语言。这本书通过易于理解的方式介绍了23种经典的GoF设计模式,帮助开发者提升代码的可复用性和可维护性。设计模式是软件工程中的重要...
《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...
重视大脑的学习指南Head First设计模式,学习为何朋友们对工厂模式的认知可能有错,把事关紧要的模式直接装入脑海里,发掘模式大师的秘密,避免一些尴尬的错误,探究星巴兹咖啡如何以装饰者模式让自己的股价翻倍。
总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...
《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特、生动的方式讲解了设计模式这一核心的软件工程概念。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...
《Head First Design Patterns》是一本深入浅出介绍设计模式的图书,由Eric Freeman、Elisabeth Freeman、Bert Bates和Kathy Sierra联合编写。本书结合认知科学原理和神经生物学研究,采用引导式教学方法,通过故事...
《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
《HeadFirst Design Patterns》是设计模式领域中一本非常受欢迎的入门书籍,以其独特的教学方式深受读者喜爱。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决常见问题的经验和方法,使得开发者...
《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...
《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...
《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,中文版的出现使得更多中国程序员能够轻松理解和应用这些设计原则。设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结,...
《HeadFirst设计模式》是设计模式领域的一本经典著作,以其独特的教学方式和生动的插图深受初学者喜爱。这本书通过实例和互动式的学习方法,深入浅出地讲解了23种经典的设计模式。源代码作为理论知识的实践部分,...
《Head First 设计模式》是一本非常受欢迎的软件设计书籍,它以易懂且生动的方式介绍了23种经典的GOF设计模式。这本书的源代码包含了书中所有示例的实现,对于学习和理解设计模式有着极大的帮助。源代码的下载使得...
《Head First 设计模式》是一本非常受欢迎的设计模式教程,专为初学者和有经验的开发者设计,旨在帮助读者深入理解和应用设计模式。这本书通过直观、生动的方式,讲解了23种经典的设计模式,涵盖了创建型、结构型和...
《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,以其独特的视觉呈现方式和易于理解的讲解风格,使得复杂的软件设计概念变得生动有趣。设计模式是软件开发中的一种最佳实践,是解决常见问题的经验...
《HeadFirst设计模式》是一本深受开发者欢迎的设计模式教程,其高清中文版为读者提供了方便易懂的学习资源。这本书深入浅出地介绍了23种经典的设计模式,旨在帮助Java程序员提升软件设计能力,理解并应用这些模式来...