观察者设计模式

5

I have

public class mammal implements Imammle
{

    public String getName() {
        return "Mammal";
    }

    public String speak() {
        return getName() +  "Maaaauuu";
    }

}

我需要知道我的动物何时发出声音,以便可以及时采取相应的行动,例如喂食。
我应该使用哪种设计模式?


请重新表达你的问题,因为它不够清楚。 - Phani
我在标题中看到了你问题的答案。 - mishadoff
1个回答

9

Observer 设计模式可能可用于解决您的问题。在观察者模式中,有两种不同类型的对象:

  1. 观察者 对象是希望在 Observable 对象更改时得到通知的对象。
  2. Observable 对象是可以被观察者观察的对象。

观察者 会向他们希望观察的 Observable 对象注册。每当一个 Observable 对象发生更改时,它会通知所有已经注册的 观察者

根据您的代码示例,我将假设您正在使用 Java。在这种情况下,您可以使用 ObserverObservable 来减少对现有代码所需进行的更改数量。

public class mammal extends java.util.Observable implements Imammle
{

    public String getName() {
        return "Mammal";
    }

    public String speak() {
        setChanged(); // We have been changed
        notifyObservers(); // Notify everyone that we have changed
        return getName() +  "Maaaauuu";
    }

}

现在我们创建一个类,希望能够监视某些变化:
public class Watcher implements java.util.Observer
{
    public void update(Observable o, Object arg) {
        System.out.println("Something has changed");
    }
}

最后,我们将观察者注册到一个 mammal 中,这样它们就可以在其发生变化时被通知。
public class Main
{
    public static void main(String args[]) {
        mammal cow = new mammal();
        Watcher farmer = new Watcher();
        cow.addObserver(farmer);
        cow.speak();
    }
}

这种方法存在一些缺点:
  1. 观察者可以注册到任何可观察对象上。您可能希望您的观察者只能观察哺乳动物。反过来,您可能希望只有某些类型的观察者能够观察哺乳动物。
  2. 实际上,您的观察者无法知道哺乳动物发生了什么变化,除非
    • 哺乳动物使用 notifyObservers(Object arg) 方法向观察者传递某种消息
    • 或者观察者检查哺乳动物中设置的公共标志

如果以上任何一个缺点对您造成问题,则可能需要避免使用观察者和可观察对象,并考虑修改现有类(哺乳动物和您的观察者)以实现其自己的应用程序特定方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接