9/17
软件设计 石家庄铁道大学信息学院
实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
3. package com.gazikel;
4.
5. // 产品接口
6. public interface Product {
7. void accept(Visitor visitor);
8. }
9.
10. // 具体产品:苹果
11. package com.gazikel;
12.
13. public class Apple implements Product {
14. @Override
15. public void accept(Visitor visitor) {
16. visitor.visit(this);
17. }
18. }
19.
20. // 具体产品:书
21. package com.gazikel;
22.
23. public class Book implements Product {
24. @Override
25. public void accept(Visitor visitor) {
26. visitor.visit(this);
27. }
28. }
29.
30. // 访问者抽象类
31. package com.gazikel;
32.
33. public abstract class Visitor {
34. protected String name;
35.
36. public void setName(String name) {
37. this.name = name;
38. }
39.
40. public abstract void visit(Apple apple);
41. public abstract void visit(Book book);
42. }
43.
44. // 具体访问者:顾客
45. package com.gazikel;
46.
47. public class Customer extends Visitor {
48. @Override
49. public void visit(Apple apple) {
50. System.out.println("顾客" + name + "选苹果");
51. }
52.
53. @Override
54. public void visit(Book book) {
55. System.out.println("顾客" + name + "买书");
56. }
57. }
58.
59. // 具体访问者:打包员
60. package com.gazikel;
61.
62. public class Packer extends Visitor {
63. @Override
64. public void visit(Apple apple) {
65. System.out.println("打包员" + name + "给苹果打包");
66. }
67.
68. @Override
69. public void visit(Book book) {
70. System.out.println("打包员" + name + "给书打包");
71. }
72. }
73.
74. // 具体访问者:收银员
75. package com.gazikel;
76.
77. public class Saler extends Visitor {
78. @Override
79. public void visit(Apple apple) {
80. System.out.println("收银员" + name + "给苹果过秤,然后计算其价格");
81. }
82.
83. @Override
84. public void visit(Book book) {
85. System.out.println("收银员" + name + "直接计算书的价格");
86. }
87. }
88.
89. // 购物车
90. package com.gazikel;
91.
92. import java.util.ArrayList;
93. import java.util.List;
94.
95. public class BuyBasket {
96. private List<Product> products = new ArrayList<>();
97.
98. public void accept(Visitor visitor) {
99. for (Product product : products) {
100. product.accept(visitor);
101. }
102. }
103.
104. public void addProduct(Product p) {
105. products.add(p);
106. }
107.
108. public void removeProduct(Product p) {
109. products.remove(p);
110. }
111. }
112.
113. // 客户端测试类
114. package com.gazikel;
115.
116. public class Client {
117. public static void main(String[] args) {
118. BuyBasket buyBasket = new BuyBasket();
119.
120. buyBasket.addProduct(new Apple());
121. buyBasket.addProduct(new Book());
122.
123. Visitor saler = new Saler();
124. saler.setName("张三");
125. System.out.println("----收银员----");
126. buyBasket.accept(saler);
127.
128. Visitor packer = new Packer();
129. packer.setName("李四");
130. System.out.println("----打包员----");
131. buyBasket.accept(packer);
132.
133. Visitor customer = new Customer();
134. customer.setName("王五");
135. System.out.println("----顾客----");
136. buyBasket.accept(customer);
137. }
138. }
3. 注意编程规范。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步