Java设计模式中的装饰者模式
模式介绍
UML类图
装饰者模式案例
装饰者模式优点
装饰者模式缺点
模式介绍23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
UML类图类图解析:
Componet:主体
ConcreateComponent:主体具体实现类
Decorator:装饰者
ConcreteDecorate:装饰者具体实现类
装饰者模式案例背景介绍:有一家咖啡店,店中有许多品种的咖啡(ShortBlack、Decaf、Espresso…),咖啡可以添加不同口味(Chocolate、Milk、Soy等),采用装饰者模式可以很好的解决该问题
装饰者下单 (2份巧克力+1份牛奶+LangBlack) 如下图所示:
类结构图
:
Drink、Coffee及其子类代码如下:
public abstract class Drink {
private String des;//描述
private float price = 0.0f;
/**
* 计算价格的方法
* @return
*/
public abstract float cost();
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
public class Coffee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
public class ShortBlack extends Coffee{
public ShortBlack() {
setDes("浓缩咖啡");
setPrice(4);
}
}
public class Espresso extends Coffee{
public Espresso() {
setPrice(6);
setDes("意大利咖啡");
}
}
public class LongBlack extends Coffee{
public LongBlack() {
setPrice(5);
setDes("美式咖啡");
}
}
Decorator及其子类
public class Decorator extends Drink {
private Drink drink;
public Decorator(Drink drink) { // 聚合
this.drink = drink;
}
@Override
public float cost() {
// 调料的价格 + 咖啡的价格
return super.getPrice() + drink.cost();
}
@Override
public String getDes() {
return super.getDes() + " && " + drink.getDes();
}
}
public class Chocolate extends Decorator{
public Chocolate(Drink drink) {
super(drink);
setDes("巧克力");
setPrice(3);
}
}
public class Milk extends Decorator{
public Milk(Drink drink) {
super(drink);
setDes("牛奶");
setPrice(2);
}
}
public class Soy extends Decorator{
public Soy(Drink drink) {
super(drink);
setDes("豆浆");
setPrice(1.5f);
}
}
CoffeeBar测试类
public class CoffeeBar {
public static void main(String[] args) {
// 点一份咖啡
Drink order = new LongBlack();
System.out.println(order.cost() + "$\t" + order.getDes());
// 加一份牛奶
order = new Milk(order);
System.out.println(order.cost() + "$\t" + order.getDes());
// 加两份巧克力
order = new Chocolate(order);
System.out.println(order.cost() + "$\t" + order.getDes());
order = new Chocolate(order);
System.out.println(order.cost() + "$\t" + order.getDes());
}
}
实现结果:
装饰者模式优点Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰者模式缺点这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
到此这篇关于Java设计模式中的装饰者模式的文章就介绍到这了,更多相关Java装饰者模式内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!
相关内容
-
确定java按钮响应事件的代码
确定java按钮响应事件的代码,,* 阅读本文可以结合最后在java...
-
java电脑驱动下载|java驱动开发
java电脑驱动下载|java驱动开发,,1. java驱动开发你可以写一个...
-
java方法抽取快捷键|java获取返回值快捷键
java方法抽取快捷键|java获取返回值快捷键,,1. java获取返回值...
-
电脑无法运行java|电脑无法运行jar文件
电脑无法运行java|电脑无法运行jar文件,,1. 电脑无法运行jar文...
-
java开发用什么电脑好|JAVA开发用什么电脑
java开发用什么电脑好|JAVA开发用什么电脑,,1. JAVA开发用什么...
-
oracle中NUMBER类型和java中对应类型
oracle中NUMBER类型和java中对应类型,类型,数据类型,问题: 今...
-
java快捷键代码格式化|哪个快捷键可以将代码格
java快捷键代码格式化|哪个快捷键可以将代码格式化,,哪个快捷...
-
java生成注解快捷键|java生成注解快捷键是什么
java生成注解快捷键|java生成注解快捷键是什么,,1. java生成注...
-
JAVAscript里面的document.write是干什么
JAVAscript里面的document.write是干什么,内容,方法,本文目录J...
-
java如何换行快捷键|快捷键怎么快速换行
java如何换行快捷键|快捷键怎么快速换行,,1. 快捷键怎么快速换...
-
Java创建对象的几种方式
Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几...
-
JavaScript里的document.querySelectorAll|是什
JavaScript里的document.querySelectorAll|是什么意思,方法,...
-
java模拟器电脑按键|java模拟器怎么使用
java模拟器电脑按键|java模拟器怎么使用,,1. java模拟器怎么使...
-
电脑启用java|电脑启用网络发现启用不了怎么办
电脑启用java|电脑启用网络发现启用不了怎么办,,电脑启用网络...
-
7723手机游戏网|7723手机游戏网JAVA
7723手机游戏网|7723手机游戏网JAVA,7723手机游戏网,不能掉下...