9/18

软件设计 石家庄铁道大学信息学院

实验 21:观察者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解观察者模式的动机,掌握该模式的结构;
2、能够利用观察者模式解决实际问题。

[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:
1. 画出对应类图;

2. 提交源代码;
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. // 观察者接口
7. interface Observer {
8. void update(String stockName, float price);
9. }
10.
11. // 具体观察者(股民)
12. class ConcreteObserver implements Observer {
13. private String name;
14.
15. public ConcreteObserver(String name) {
16. this.name = name;
17. }
18.
19. @Override
20. public void update(String stockName, float price) {
21. if (price > 1.05 * price) {
22. System.out.println(name + " 听到价格上涨的消息,买入股票 " + stockName);
23. } else if (price < 0.95 * price) {
24. System.out.println(name + " 听到价格下降的消息,大哭一场");
25. }
26. }
27.
28. public void cry() {
29. System.out.println(name + " 大哭一场");
30. }
31.
32. public void buy(String stockName) {
33. System.out.println(name + " 买入股票 " + stockName);
34. }
35. }
36.
37. // 主题接口
38. interface Subject {
39. void attach(Observer o);
40. void detach(Observer o);
41. void notify(String stockName, float price);
42. }
43.
44. // 具体主题(股票)
45. class ConcreteSubject implements Subject {
46. private List<Observer> observers = new ArrayList<>();
47. private String stockName;
48. private float price;
49.
50. public ConcreteSubject(String stockName) {
51. this.stockName = stockName;
52. }
53.
54. public void setPrice(float price) {
55. this.price = price;
56. notify(stockName, price);
57. }
58.
59. @Override
60. public void attach(Observer o) {
61. observers.add(o);
62. }
63.
64. @Override
65. public void detach(Observer o) {
66. observers.remove(o);
67. }
68.
69. @Override
70. public void notify(String stockName, float price) {
71. for (Observer observer : observers) {
72. observer.update(stockName, price);
73. }
74. }
75. }
76.
77. // 客户端
78. public class ObserverPatternDemo {
79. public static void main(String[] args) {
80. ConcreteSubject stock = new ConcreteSubject("TechStock");
81. ConcreteObserver alice = new ConcreteObserver("Alice");
82. ConcreteObserver bob = new ConcreteObserver("Bob");
83.
84. stock.attach(alice);
85. stock.attach(bob);
86.
87. stock.setPrice(100); // 初始价格
88. stock.setPrice(105); // 价格上涨5%
89. stock.setPrice(95); // 价格下降5%
90. }
91. }
92. 注意编程规范。

 

posted @ 2024-09-18 15:30  Hbro  阅读(27)  评论(0)    收藏  举报