要求:
在一家拍卖行,有三个竞拍者(Observer)参加竞拍,拍卖过程中,拍卖者每报出一次竞价,拍卖师(Subject)都会将当前的最高标价信息通知给其他竞拍者,其他竞拍者收到通知后做出相应的反映(继续竞价或放弃竞价)。请用观察者模式编写代码模拟整个竞拍过程。绘制该模式的UML类图
代码实现:
//Auctioneer.java
import java.util.ArrayList;
import java.util.List;
class Auctioneer implements Subject { // Auctioneer类
private List<Observer> o1 = new ArrayList<>();
private int MaxBid = 0;
public void registerObserver(Observer observer) {
o1.add(observer);
}
public void removeObserver(Observer observer) {
o1.remove(observer);
}
public void notifyObservers(int bidAmount) {
for (Observer observer : o1) {
observer.update(bidAmount);
}
}
public void acceptBid(int bidAmount) {
if (bidAmount > MaxBid) {
MaxBid = bidAmount;
System.out.println("当前最高出价为 $" + MaxBid);
notifyObservers(bidAmount);
} else {
System.out.println("出价必须高于当前最高出价 $" + MaxBid);
}
}
}
//Bidder.java
public class Bidder implements Observer { //Bidder类
private String name;
public Bidder(String name) {
this.name = name;
}
public void update(int bidAmount) {
System.out.println(name + "收到通知:当前最高报价为 $" + bidAmount + ". 是否继续出价?");
}
}
//Main.java
public class Main { //测试类
public static void main(String[] args) {
Auctioneer a1 = new Auctioneer();
Bidder b1 = new Bidder("竞拍者A");
Bidder b2 = new Bidder("竞拍者B");
Bidder b3 = new Bidder("竞拍者C");
a1.registerObserver(b1);
a1.registerObserver(b2);
a1.registerObserver(b3);
System.out.println("拍卖开始,起始价 2000");
a1.acceptBid(2000);
System.out.println();
System.out.println("竞拍者B 出价 2100");
a1.acceptBid(2100);
System.out.println();
System.out.println("竞拍者C 出价 2500");
a1.acceptBid(2500);
}
}
//Observer.java
public interface Observer { // Observer接口
void update(int bidAmount);
}
//Subject.java
interface Subject { //Subject接口
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(int bidAmount);
}