Java设计模式大题练习4

       学校北门外开了一家桂林米粉店,目前只有牛腩桂林米粉(12元一碗)和叉烧桂林米粉(10元一碗)两种主食,以后还可能增加更多品种的主食如牛肉桂林米粉、瘦肉螺蛳粉等。当买主食的时候顾客可以选配小菜(小菜由顾客任选,可选一样或多样,每样小菜也可以选多份,也可以不选,每选一份小菜在结账时要加上这份小菜的价钱),小菜有包括有酸笋丝(2元一份)、花生米(3元一份)和酸菜(1元一份),以后还可能有更多种类的小菜。模拟场景如下:顾客甲买了一碗牛腩桂林米粉,先选了一份酸笋丝,再选了一份花生米。 顾客乙买了一碗叉烧桂林米粉,先选了一份并选了酸菜,后又选了一份花生米,最后又选了一份酸菜。请根据题意,选择合适的设计模式进行设计,分别输出每位顾客点了什么,最终价钱是多少。(作答时可以在较详细地描述设计思路后画出设计类图,也可以简单描述设计思路后直接给出java代码)

正确答案:

经分析小菜可以不选,选一样或多样,对小菜的选取情况不影响对主食的选择,可以采用装饰模式。

在设计中,可以将主食类作为抽象组件,其中包括获取点菜信息方法抽象方法,该方法返回值类型为字符串类型;计算价格抽象方法,该方法返回值类型为整型。

将牛腩桂林米粉类和叉烧桂林米粉作为具体组件,继承自主食类,其实现获取点菜信息方法分别为返回"牛腩桂林米粉"和"叉烧桂林米粉",其实现计算价格方法分别为返回12和10。

小菜类作为抽象装饰类,该类继承自主食类,同时包含一个主食引用指向被它装饰的对象,小菜类的构造方法中包含一个主食类引用作为参数,小菜类的指向被它装饰的对象的引用设置为该参数的值。小菜类实现获取点菜信息方法是调用被它装饰的对象的获取点菜信息方法并将返回值直接返回,小菜类实现计算价格方法是调用被它装饰的对象的计算价格方法并将返回值直接返回。

酸笋丝、花生米、酸菜这三个类都是具体装饰类,继承自小菜类,这三个类都包含一个主食类引用作为参数的构造方法,其构造方法的实现都是直接调用父类同样带主食类引用作为参数的构造方法。这三个类都覆盖小菜类的获取点菜信息方法,其实现中都是先调用父类的显示点菜信息方法获得结果字符串后分别连接上“加一份酸笋丝”、 “加一份花生米”、 “加一份酸菜”;这三个类都覆盖小菜类的计算价格方法,其实现中都是先调用父类的计算价格方法获得结果后分别加上2、3、1。

场景的实现可以是:

先用主食引用一去指向创建的一个牛腩桂林米粉对象,然后再用主食引用一指向创建的一个酸笋丝对象,其参数为主食引用一,然后再用主食引用一指向创建的一个花生米对象,其参数为主食引用一,最后打印输出 调用主食引用一的获取点菜信息方法的结果和调用主食引用一的计算价格方法的结果。(这是输出顾客甲的点菜情况和价钱)

先用主食引用二去指向创建的一个叉烧桂林米粉对象,然后再用主食引用二指向创建的一个酸菜对象,其参数为主食引用二,然后再用主食引用二指向创建的一个花生米对象,其参数为主食引用二,然后再用主食引用二指向创建的一个酸菜对象,其参数为主食引用二,最后打印输出 调用主食引用二的获取点菜信息方法的结果和调用主食引用二的计算价格方法的结果。(这是输出顾客乙的点菜情况和价钱)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值