观察?设计模式

时间:2012-04-09 05:29:13

标签: design-patterns

我有

public class mammal implements Imammle
{

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

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

}

我需要知道我的动物发出声音的时间,以便我能像吃饭一样实时采取相应的行动 我应该使用什么样的设计模式? 感谢。

1 个答案:

答案 0 :(得分:5)

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

  1. 观察者对象是希望在Observable对象发生变化时得到通知的对象。
  2. 可观察的对象是Observers可以观看的对象
  3. 观察员已在他们希望观看的可观察对象中注册。每当可观察对象发生变化时,它都会通知所有已注册的观察者

    根据您的代码示例,我将假设您使用的是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. 观察者可以在任何Observable对象中注册。您可能希望观察者只能观察mammal。另一方面,您可能希望只有某些类型的观察者能够观察mammal
    2. 你的观察者确实没有办法知道mammal没有改变的确切变化
    3. 如果这些缺点中的任何一个对您来说都是一个问题,那么您可能希望避免使用Observer和Observable并考虑修改现有的类(mammal以及您的观察者是什么)来实现自己的应用程序具体方法。