【java设计模式】观察者模式——猫、狗与老鼠 :假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。问题分析:下面是观察者模式的模板import java.util.*;public abstract class Subject {//定义一个观察者集合用于存储所有观察者对象protected ArrayList observer
·
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
问题分析:
下面是观察者模式的模板
import java.util.*;
public abstract class Subject {
//定义一个观察者集合用于存储所有观察者对象
protected ArrayList observers<Observer> = new ArrayList();
//注册方法,用于向观察者集合中增加一个观察者
public void attach(Observer observer) {
observers.add(observer);
}
//注销方法,用于在观察者集合中删除一个观察者
public void detach(Observer observer) {
observers.remove(observer);
}
//声明抽象通知方法
public abstract void notify();
}
public class ConcreteSubject extends Subject {
//实现通知方法
public void notify() {
//遍历观察者集合,调用每一个观察者的响应方法
for(Object obs:observers) {
((Observer)obs).update();
}
}
}
源码:
MySubject.java
package observer;
import java.util.*;
public abstract class MySubject {
protected ArrayList observers = new ArrayList();
//注册方法
public void attach(MyObserver observer) {
observers.add(observer);
}
//注销方法
public void detach(MyObserver observer) {
observers.remove(observer);
}
//抽象通知方法
public abstract void cry();
}
MyObserver.java
package observer;
public interface MyObserver {
void response();
}
Cat.java
package observer;
public class Cat extends MySubject{
public void cry() {
System.out.println("猫叫");
System.out.println("-------------------------");
//箱所有观察者发出通知
for(Object obs:observers) {
((MyObserver)obs).response();
}
}
}
Dog.java
package observer;
public class Dog implements MyObserver{
public void response() {
System.out.println("狗跟着叫!");
}
}
Mouse.java
package observer;
public class Mouse implements MyObserver{
public void response() {
System.out.println("老鼠努力逃跑!");
}
}
Client.java
package observer;
public class Client {
public static void main(String[] args) {
MySubject subject=new Cat();
MyObserver obs1,obs2,obs3;
obs1=new Mouse();
obs2=new Mouse();
obs3=new Dog();
subject.attach(obs1);
subject.attach(obs2);
subject.attach(obs3);
subject.cry();
}
}
更多推荐
所有评论(0)