东北大学 Java练习 实验1 Using Design Patterns in the Gourmet Coffee System

需求分析

这次实验就是要实现一个功能:在卖咖啡系统上“优美”地输出账单信息。
怎么做到“优美”呢?按照文档中给出的三种格式(纯文本,HTML,XML)进行格式化,然后输出。
当然,是否学过HTML与XML对这个实验基本不影响,会照猫画虎就行。
源码 http://chenjinsui.com/oop_homework.zip

策略模式(strategy pattern)

都是格式化,但又有三种不同的格式化的方法,这个要怎么实现呢?我们可以在同一个类中写出三种不同的方法,也就是硬编码(Hard Coding),然后通过case或if进行选择。如果大型项目这样做的话代码繁杂、维护困难。为了避免这种情况的发生,我们把可以改变的部分(三种格式化方法)提取出来作为接口,再分别写三个类去实现这个接口。

这样,接口就称作抽象策略类(Strategy)。纯文本格式化、HTML格式化、XML格式化就是三种策略,称作具体策略类(ConcreteStrategy)。GoremetCoffee类中维护了接口对象的引用,所以它就是环境类(Context)

环境类(Context):用一个具体策略类对象来配置。维护一个对抽象策略类对象的引用。
抽象策略类(Strategy):定义所有支持的算法的公共接口。环境类使用这个接口来调用某具体策略类定义的算法。
具体策略类(ConcreteStrategy):以抽象策略类接口实现某具体算法。

单例模式(singleton pattern)

每一个格式化方法怎么具体实现呢?
根据前面说的方法,我们已经写好了三个格式化类,就可以在GoremetCoffee类中根据用户指令,创建对应类的对象,再调用对象的方法实现账单的格式化。

但是,打印账单是一个频繁使用的功能(根据生活经验得出),频繁地创建、销毁实例会造成很大的开销,有没有一种设计模式可以不用频繁地创建、销毁实例呢?这就用到了单例模式。

单例模式跟策略模式一样,都是Java中最简单的设计模式之一。
单例模式的核心思想是:类自己创建自己的唯一对象,并提供方法让其他类去访问。
要注意的是,避免其它类将自己的格式化类实例化,要将构造器定义为private。单例对象和get方法都要定义为public static。

这样又有一个缺点,定义的单例对象可能永远用不上,浪费了内存,也有可能被当做垃圾给回收掉。但这也有解决办法,这里不进行展开。

代码实现

以HTMLSalesFormatter类为例。

为了节约内存,用到了StringBuilder类。

    /**
     * @param sales the Sales object wanted to be formatted
     * @return a string performing a sales object formatted in HTML way
     */
    @Override
    public String formatSales(Sales sales) {
        StringBuilder info = new StringBuilder("\n<html>\n  <body>\n    <center><h2>Orders</h2></center>\n");
        for (Order order : sales) {
            info.append("    <hr>\n");
            info.append("    <h4>Total =").append(order.getTotalCost()).append("</h4>\n");

            for (OrderItem item : order) {
                info.append("      <p>\n");
                info.append("        <b>code:</b> ").append(item.getProduct().getCode()).append("<br>\n");
                info.append("        <b>quantity:</b> ").append(item.getQuantity()).append("<br>\n");
                info.append("        <b>price:</b> ").append(item.getProduct().getPrice()).append("\n");
                info.append("      </p>\n");
            }

        }
        info.append("  </body>\n</html>");
        return info.toString();
    }
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FengLing255

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值