java: Decorator Pattern
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc OrderLine.java * * */ package com.javapatterns.decorator; import java.text.NumberFormat; /** *具体类 * 货物清单 * @author geovindu * * */ public class OrderLine { private String itemName; private int units; private double unitPrice; /** *产品名取值方法 * @return * */ public String getItemName() { return itemName; } /** *产品名赋值方法 * @param itemName * * */ public void setItemName(String itemName) { this .itemName = itemName; } /** *单位数量的取值方法 * @return * * */ public int getUnits() { return units; } /** *单位数量的赋值方法 * @param units 单位数量 * * */ public void setUnits( int units) { this .units = units; } /** *单价的取值 方法 * @return * * */ public double getUnitPrice() { return unitPrice; } /** *单价的赋值 方法 * @param unitPrice * * */ public void setUnitPrice( double unitPrice) { this .unitPrice = unitPrice; } /** *打印订单方法 * * */ public void printLine() { System.out.println(itemName + "\t" + units + "\t" + formatCurrency(unitPrice) + "\t" + formatCurrency(getSubtotal())); } /** *小计金额取值方法 * @return * * */ public double getSubtotal() { return unitPrice * units; } /** *工具方法 将金额格式化 * @param amnt * @return * * */ private String formatCurrency( double amnt) { return NumberFormat.getCurrencyInstance().format(amnt); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc Order.java * * */ package com.javapatterns.decorator; import java.util.Date; import java.util.Vector; import java.text.NumberFormat; /** *抽象类 * @author geovindu * * */ abstract public class Order { private OrderLine lnkOrderLine; protected String customerName; protected Date salesDate; protected Vector items = new Vector( 10 ); /** *打印方法 * * */ public void print() { for ( int i = 0 ; i < items.size() ; i++) { OrderLine item = (OrderLine) items.get(i); item.printLine(); } } /** *客户名取值方法 * @return 返回客户名 * */ public String getCustomerName() { return customerName; } /** *客户名赋值方法 * @param customerName 输入客户名 * */ public void setCustomerName(String customerName) { this .customerName = customerName; } /** *返回销售日期 * @return 返回售销日期 * */ public Date getSalesDate() { return salesDate; } /** *赋值销售日期 * @param salesDate 输入售销日期 * */ public void setSalesDate(Date salesDate) { this .salesDate = salesDate; } /** *增加一行销销售产品 * @param item * * */ public void addItem(OrderLine item) { items.add(item); } /** *删除一行销售产品 * @param item * * */ public void remoteItem(OrderLine item) { items.remove(item); } /** *返还总额 * @return * * */ public double getGrandTotal() { double amnt = 0 .0D; for ( int i = 0 ; i < items.size() ; i++) { OrderLine item = (OrderLine) items.get(i); amnt += item.getSubtotal(); } return amnt; } /** *工具方法 将金额格式化 * @param amnt 输入数量 * @return 返回格式化的数据 * * */ protected String formatCurrency( double amnt) { return NumberFormat.getCurrencyInstance().format(amnt); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc SalesOrder.java * * */ package com.javapatterns.decorator; /** *具体类 * @author geovindu * * */ public class SalesOrder extends Order{ /** *构造 * */ public SalesOrder() { } /** *打印 * * */ public void print() { super .print(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc OrderDecorator.java * * */ package com.javapatterns.decorator; /** *抽象装饰类 * @author geovindu * * */ abstract public class OrderDecorator extends Order{ protected Order order; /** * 构造 * */ public OrderDecorator(Order order) { this .order = order; this .setSalesDate( order.getSalesDate() ); this .setCustomerName( order.getCustomerName() ); } /** * * */ public void print() { super .print(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc HeaderDecorator.java * * */ package com.javapatterns.decorator; /** *抽象装饰类 打印页头 * @author geovindu * */ public class HeaderDecorator extends OrderDecorator{ /** * * */ public HeaderDecorator(Order anOrder) { super (anOrder); } /** * * */ public void print() { this .printHeader(); super .order.print(); } /** *打印页头 * * */ private void printHeader() { System.out.println( "\t***\t售销单\t***\n缔友超市售销清单\n销售日期: " + order.getSalesDate()); System.out.println( "========================================================" ); System.out.println( "产品名称\t\t数量\t单价\t合计" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /** * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 装饰模式 Decorator Patterns * 历史版本: JDK 14.02 * 2022-09-12 创建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:date * 接口类 * 2022-09-12 修改者:Geovin Du * 生成API帮助文档的指令: *javadoc - -encoding Utf-8 -d apidoc FooterDecorator.java * * */ package com.javapatterns.decorator; import java.text.NumberFormat; /** *抽象装饰类 打印页层 * @author geovindu * * */ public class FooterDecorator extends OrderDecorator{ /** * * */ public FooterDecorator(Order anOrder) { super (anOrder); } /** * * */ public void print() { super .order.print(); printFooter(); } /** *打印页层 * * */ private void printFooter() { System.out.println( "========================================================" ); System.out.println( "总额:\t\t\t\t" + formatCurrency( super .order.getGrandTotal())); } } |
调用测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //装饰模式 order = new SalesOrder(); order.setSalesDate( new Date()); order.setCustomerName( "捷为工作室" ); OrderLine line1 = new OrderLine(); line1.setItemName( "涂氏PDA" ); line1.setUnitPrice( 154.23 ); line1.setUnits( 4 ); order.addItem(line1); OrderLine line2 = new OrderLine(); line2.setItemName( "RFID读写器" ); line2.setUnitPrice( 300.45 ); line2.setUnits( 1 ); order.addItem(line2); order = new HeaderDecorator( new FooterDecorator(order)); order.print(); |
输出:
1 2 3 4 5 6 7 8 9 | *** 售销单 *** 缔友超市售销清单 销售日期: Sat Sep 17 14 : 11 : 55 CST 2022 ======================================================== 产品名称 数量 单价 合计 涂氏PDA 4 ¥ 154.23 ¥ 616.92 RFID读写器 1 ¥ 300.45 ¥ 300.45 ======================================================== 总额: ¥ 917.37 |
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2012-09-17 SQL 生成公曆和農曆對照數據,公曆查找農曆和農曆查找公曆函數