使用观察者模式,实现如下业务场景,订蛋糕,蛋糕胚可以选择千层或者戚风,尺寸可以选择六寸或者八寸,口味可以选择芒果或者草莓
时间: 2024-03-05 12:50:33 浏览: 149
首先,我们定义一个抽象主题(Cake)类,其中包含添加、删除和通知观察者的方法:
```java
public abstract class Cake {
protected List<CakeObserver> observers = new ArrayList<>();
public void attach(CakeObserver observer) {
observers.add(observer);
}
public void detach(CakeObserver observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (CakeObserver observer : observers) {
observer.update();
}
}
}
```
接下来,我们定义一个具体主题(CakeOrder)类,用于实现抽象主题中的方法,并在订单发生变化时通知观察者:
```java
public class CakeOrder extends Cake {
private String cakeType;
private String size;
private String flavor;
public void setCakeType(String cakeType) {
this.cakeType = cakeType;
notifyObservers();
}
public void setSize(String size) {
this.size = size;
notifyObservers();
}
public void setFlavor(String flavor) {
this.flavor = flavor;
notifyObservers();
}
public String getCakeType() {
return cakeType;
}
public String getSize() {
return size;
}
public String getFlavor() {
return flavor;
}
}
```
在具体主题中,我们定义了一个蛋糕类型、尺寸和口味,以及设置这些属性的方法。在每次设置属性时,都调用了抽象主题中的通知方法,将订单信息发送给所有观察者。
然后,我们定义一个抽象观察者(CakeObserver)类,其中包含一个抽象方法,用于接收通知:
```java
public abstract class CakeObserver {
protected Cake cake;
public abstract void update();
}
```
接下来,我们定义一个具体的观察者(CakeOrderObserver)类,用于实现抽象观察者中的方法:
```java
public class CakeOrderObserver extends CakeObserver {
public CakeOrderObserver(Cake cake) {
this.cake = cake;
this.cake.attach(this);
}
@Override
public void update() {
System.out.println("您的蛋糕订单已更新,类型为:" + cake.getCakeType() + ",尺寸为:" + cake.getSize() + ",口味为:" + cake.getFlavor());
}
}
```
在具体观察者中,我们重写了抽象观察者中的方法,在收到通知时打印出当前订单的信息。
现在,我们可以使用观察者模式来实现订蛋糕功能了:
```java
public class ObserverPatternDemo {
public static void main(String[] args) {
CakeOrder cakeOrder = new CakeOrder();
CakeOrderObserver observer1 = new CakeOrderObserver(cakeOrder);
CakeOrderObserver observer2 = new CakeOrderObserver(cakeOrder);
CakeOrderObserver observer3 = new CakeOrderObserver(cakeOrder);
cakeOrder.setCakeType("戚风"); // 订单类型为戚风
cakeOrder.setSize("六寸"); // 订单尺寸为六寸
cakeOrder.setFlavor("草莓"); // 订单口味为草莓
}
}
```
在主函数中,我们创建了一个具体主题和三个具体观察者,并将它们联系在一起。然后,我们设置订单的类型、尺寸和口味,观察者们会收到通知并打印出当前订单的信息。运行程序后,我们可以看到输出的订单信息:
```
您的蛋糕订单已更新,类型为:戚风,尺寸为:六寸,口味为:草莓
您的蛋糕订单已更新,类型为:戚风,尺寸为:六寸,口味为:草莓
您的蛋糕订单已更新,类型为:戚风,尺寸为:六寸,口味为:草莓
```