【问题标题】:Observer? design pattern观察者?设计模式
【发布时间】:2012-04-09 05:29:13
【问题描述】:

我有

public class mammal implements Imammle
{

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

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

}

我需要知道我的动物何时发出声音,以便我可以实时采取相应的行动,例如吃饲料。
我应该使用什么样的设计模式? 谢谢。

【问题讨论】:

  • 由于不清楚,请重新表述您的问题。
  • 我在标题中看到了您问题的答案

标签: design-patterns observer-pattern


【解决方案1】:

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

  1. Observer 对象是希望在 Observable 对象发生变化时得到通知的对象。
  2. Observable 对象是观察者可以观察到的对象

观察者注册到他们希望观察的Observable对象。每当 Observable 对象发生变化时,它都会通知所有已向其注册的 Observers

根据您的代码示例,我将假设您使用的是 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. Observers 可以注册到任何 Observable 对象。您可能希望您的观察者只能观察mammals。另一方面,您可能希望只有某些类型的观察者能够观察mammal
  2. 您的Observer 真的没有任何方法可以知道mammal 的具体变化

如果这些缺点中的任何一个对您来说是个问题,那么您可能希望避免使用 ObserverObservable 并考虑修改您现有的类(mammal 以及您的 Observers 是什么)以实现自己的,特定于应用程序的方法。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2011-11-25
    • 2011-09-25
    • 2010-12-31
    • 2011-03-22
    • 2020-12-28
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多