猫叫老鼠跑-观察者模式

  当一个对象的状态发生改变时,他的所有依赖者都会收到通知并自动更新---------观察者模式

  即,猫A发出了叫声,老鼠B(老鼠C,D,E,F...)听到了这个声音,立即掉头就跑.

 1 package ares.core;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class Cat implements Subject {
 6     private ArrayList<Observer> observers = new ArrayList<Observer>();
 7     private String name;
 8 
 9     public Cat(String name) {
10         this.name = name;
11     }
12     
13     public String getName() {
14         return this.name;
15     }
16 
17     @Override
18     public void register(Observer o) {
19         observers.add(o);
20     }
21 
22     @Override
23     public void remove(Observer o) {
24         if (observers != null && observers.size() > 0) {
25             int index = observers.indexOf(o);
26             if (index >= 0) {
27                 observers.remove(index);
28             }
29         }
30     }
31 
32     @Override
33     public void notifyObserver() {
34         for (Observer observer : observers) {
35             observer.listen();
36         }
37     }
38 
39     public void shout() {
40         System.out.println(this.name+":喵~喵~");
41         notifyObserver();
42     }
43 
44 }
1 package ares.core;
2 
3 public interface Subject {
4     public void register(Observer o);
5 
6     public void remove(Observer o);
7 
8     public void notifyObserver();
9 }
 1 package ares.core;
 2 
 3 public class Mouse implements Observer {
 4     private Cat cat;
 5     private String name;
 6 
 7     Mouse(String name, Cat cat) {
 8         this.name = name;
 9         this.cat = cat;
10         cat.register(this);
11     }
12 
13     @Override
14     public void listen() {
15         System.out.println(this.name + "听见"+cat.getName()+"叫!");
16         run();
17     }
18 
19     public void run() {
20         System.out.println(this.name + ":"+cat.getName()+"来了,兄弟们快跑");
21     }
22 
23 }
1 package ares.core;
2 
3 public interface Observer {
4     public void listen();
5 }
package ares.core;

public class Main {

    public static void main(String[] args) {
        Cat cat = new Cat("大洋芋");
        Mouse mouse=new Mouse("小米渣", cat);
        cat.shout();
    }

}

原文地址:https://www.cnblogs.com/liunlls/p/observer2.html