今天完成软件设计实验二十一观察者模式,并且进一步学习了画数据流图,功能架构图
实验 21:观察者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解观察者模式的动机,掌握该模式的结构;
2、能够利用观察者模式解决实际问题。
[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:
1. 画出对应类图;
2. 提交源代码;
- import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
void update(float price);
}
// 具体观察者
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(float price) {
if (price > 0) {
buyStock();
} else {
cry();
}
}
private void buyStock() {
System.out.println(name + " 听到价格上涨,买了股票!");
}
private void cry() {
System.out.println(name + " 听到价格下降,大哭了一场!");
}
}
// 主题接口
interface Subject {
void attach(Observer o);
void detach(Observer o);
void notifyObservers();
}
// 具体主题
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private float price;
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(price);
}
}
public void setPrice(float price) {
this.price = price;
notifyObservers();
}
public float getPrice() {
return price;
}
}
// 客户端代码
public class ObserverPatternDemo {
public static void main(String[] args) {
ConcreteSubject stock = new ConcreteSubject();
Observer alice = new ConcreteObserver("Alice");
Observer bob = new ConcreteObserver("Bob");
stock.attach(alice);
stock.attach(bob);
stock.setPrice(105); // 价格上涨5%
stock.setPrice(95); // 价格下降5%
}
}
4. 注意编程规范。