观察?设计模式

ale*_*eyb 2 design-patterns

我有

public class mammal implements Imammle
{

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ene 5

观察员也可能会被使用的设计模式来解决你的问题.在Observer Pattern中,有两种不同类型的对象:

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

观察者在他们希望观察Observable对象中注册.每当Observable对象发生更改时,它都会通知所有已向其注册的Observer.

根据您的代码示例,我将假设您使用的是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";
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个类,希望在发生变化时注意:

public class Watcher implements java.util.Observer
{
    public void update(Observable o, Object arg) {
        System.out.println("Something has changed");
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我们向观察者注册,mammal以便他们可以随时通知他们.

public class Main
{
    public static void main(String args[]) {
        mammal cow = new mammal();
        Watcher farmer = new Watcher();
        cow.addObserver(farmer);
        cow.speak();
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法有很多缺点:

  1. 观察者可以在任何Observable对象中注册.你可能希望你的观察者只能观察mammals.另一方面,您可能希望只有某些类型的观察者才能观察到mammal.
  2. 对于你的观察者来说,确实没有任何方法可以知道mammal没有 用什么改变了
    • mammal使用在某些类型的消息传递给观察者notifyObservers(对象ARG)方法
    • 或者Observer检查中设置的公共标志 mammal

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