博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之装饰模式的复习
阅读量:5347 次
发布时间:2019-06-15

本文共 1584 字,大约阅读时间需要 5 分钟。

经典问题:咖啡馆问题

咖啡有四种类型:HouseBlend (混合咖啡)、DarkRoast (烧烤咖啡)、Decaf ( 脱咖啡因咖啡)和espresso(浓咖啡)

调味品如:Steamed milk(清蒸调味奶)、Soy(大豆)、Mocha(当成巧克力吧)、Whipped milk(我也不知道是什么?就当细小鞭吧)

简单分析一下,我们需要解决的问题大致有如下:

  • 更改咖啡、调味品价格
  • 增添咖啡和调味品
  • 咖啡和调味品的各种组合

我的想法

两个抽象类:

Beverage做为所有cafe的超类,维持一个condiment的容器来存放所加入咖啡的所有调料品,实现getPrice()方法,该方法返回condiment容器中所有调料品的价格和自身价格的总和。

condiment作为所有调味品的超类,存放各自调料品的价格并提供接口访问

这样在更改价格,增添咖啡和调味品的时候都非常简单,不需要做太多的更改,同时可以实现所有的组合。

装饰模式的做法

首先注意到其实Beverage和condiment所需要实现和提供的功能都非常相似,且对于容器的维护效率很低下。

首先实现饮料Beverage超类:

public abstract class Beverage{  String description = "Unknow Beverage";    public String getDescription(){    return description;   }   public abstract double cost();}

 

然后让condimentDecorator调料品装饰类继承自Beverage类

public abstract class condimentDecorator extends Beverage{  public abstract String getDescription();}

接着去实现各个具体的类,HouseBlend (混合咖啡)、DarkRoast (烧烤咖啡)、Decaf ( 脱咖啡因咖啡)和espresso(浓咖啡)继承自Beverage类

Steamed milk(清蒸调味奶)、Soy(大豆)、Mocha(巧克力)、Whipped milk(细小鞭)继承自condimentDecorator类

对于调味品装饰的具体实现我们需要注意,内部需要维持一个Beverage类的对象,也就是我们需要装饰的对象

public class Mocha extends CondimentDecorator{    Beverage beverage; public Mocha (Beverage beverage){        this.beverage = beverage;    }    public String getDescription(){        return beverage.getDescription() + ",Mocha";    }    public double cost(){        return 20+beverage.cost();    }}

接着是如何使用各种调味品装饰类去装饰咖啡

Beverage beverage = new Espresso();beverage = new Mocha(beverage );beverage = new Soy(beverage );

注意,通过在调味品装饰类中添加了这一个Beverage对象,且调味品装饰类也是继承自Beverage类,我们在装饰的时候可以实现多层的装饰。

装饰模式完美解决上述问题。

转载于:https://www.cnblogs.com/likaiming/p/7051280.html

你可能感兴趣的文章
linux清空日志文件内容 (转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
Ajax : load()
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>
Zookeeper概述
查看>>
Zookeeper一致性级别
查看>>
Linux远程登录
查看>>
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
Linux目录结构
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>