感谢 Turo 和 User7。这就是我所做的。我不知道这是否是最好的解决方案,因为我不仅必须订阅观察者,而且客户也必须选择他们的兴趣。它不像订阅价格或可用性那样直接。
public enum Factors {
AVAILABILITY, PRICE
}
然后在我的客户类中,我们在观察哈希图中设置兴趣。
public class Customer implements Iobserver {
String name;
String email;
private EnumMap<Factors, Boolean> observations = new EnumMap<Factors, Boolean>(Factors.class);
public Customer(String name, String email) {
this.name = name;
this.email = email;
for (Factors factor : Factors.values()) {
observations.put(factor, false);
}
}
public void setObsevation(Factors factor, Boolean isInterested) {
observations.put(factor, isInterested);
}
public boolean getObservation(Factors factor) {
return observations.get(factor);
}
public void update(Product p, Factors factor) {
System.out.println("Dear customer " + this.name + ", the " + factor.toString().toLowerCase() + " of "+ p.getProduct() + " has changed! ");
}
}
在我的 Product 类中,观察者列表所在的位置。我添加了这个。
public void setPrix(float prix) {
if (prix != this.prix) {
this.prix = prix;
for (Iobserver o : allObservers) {
if (o.getObservation(Factors.PRICE)) {
notify(o,Factors.PRICE);
}
}
}
}
public void setAvailable(boolean available) {
this.available = available;
if (this.available == true)
for (Iobserver o : allObservers) {
if (o.getObservation(Factors.AVAILABILITY))
notify(o,Factors.AVAILABILITY);
}
}
public void notify(Iobserver o, Factors factor) {
o.update(this,factor);
}
我可以在每个因素通知之后添加一个策略。