簡體   English   中英

generics如何實現觀察者模式?

[英]How to implement observer pattern with generics?

我正在制作一個餐廳應用程序,我需要在其中使用 Generics 類型參數。 工作流程如下:客戶端(觀察者)訂購食物(接口),FoodFactory 返回具體類型(如熱狗、薯條等),然后客戶端(觀察者)收到有關它的通知。 在這個練習中我需要使用一些類。 在本練習中,類型參數<E>Food 摘要 class 可觀察:

public abstract class Observable<E>{

List<Observer<E>> observers = new ArrayList<>();

public void abbObserver(Observer <E> e){
 observers.add(e);
}

public void notifyObservers(E e){
    for(Observer observer : observers){
        observer.update(this);
    }
}

}

這個class被Order Class繼承。

public class Order<E> extends Observable<E> {

    private FoodName food;
    private List<FoodName> extras;


    public Order(FoodName food, List<FoodName> extras) {
            this.food = food;
            this.extras = extras;
    }

    public FoodName getFood() {
            return food;
    }

    public List<FoodName> getExtras() {
            return extras;
    }

    @Override
    public void abbObserver(Observer<E> e) {
            super.abbObserver(e);
    }

    @Override
    public void notifyObservers(E e) {
            System.out.println("Notifying Observers of: " + e.toString());
    }

但是我不確定我該怎么做。 我是否需要繼承List<Observer<E>> observers = new ArrayList<>(); 也? 我通常錯過了這個主題,我最近才了解到,但是我不明白這些對象如何相互通信。

我認為你的意思是:

public class FoodName {
  private final String name;

  public FoodName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}

public class Order extends Observable<FoodName> {

  private FoodName food;
  private List<FoodName> extras = new ArrayList<>();

  public Order(FoodName food, List<FoodName> extras) {
    this.food = food;
    this.extras = extras;
  }

  public FoodName getFood() {
    return food;
  }

  public List<FoodName> getExtras() {
    return extras;
  }

  public void addExtras(FoodName extra) {
    extras.add(extra);
    notifyObservers(extra);
  }

}

public interface Observer<E> {
  void update(E e);
}

public class Main {
  public static void main(String[] args) {
    Order order = new Order(new FoodName("bigmac"), new ArrayList<>());
    order.abbObserver(fn -> System.out.println(fn.getName()));
    order.addExtras(new FoodName("french fries"));
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM