您的位置:首页 > 其它

观察者模式

2017-08-02 10:57 113 查看
百度百科

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

观察者抽象类

//抽象的报纸订阅者
public abstract class Subscribers {

//提供一个方法,供观察者调用,更新状态
//比如提供一个信箱,把报纸放进去
public abstract void update(String state);

}


订阅者A

public class SubscribersA extends Subscribers{

@Override
public void update(String state) {
System.out.println("报纸更新了,内容:" + state);
}
}


订阅者B

public class SubscribersB extends Subscribers{
@Override
public void update(String state) {
System.out.println("报纸更新了,内容:" + state);
}
}


报纸抽象类(被观察者)

public abstract class Newspaper {

//哪些人订阅了报纸
protected List<Subscribers> subscribers = new ArrayList<>();

//添加到订阅者列表中
public void add(Subscribers subscriber) {
subscribers.add(subscriber);
}

//取消订阅
public void delete(Subscribers subscriber) {
subscribers.remove(subscriber);
}

//通知订阅者,报纸更新了
public void notifySubscribers(String content) {
for (Subscribers subscriber : subscribers) {
subscriber.update(content);
}
}

}


客户端

public class Main {
public static void main(String[] args) {
Newspaper xinhua = new XinhuaDaily();
Subscribers a = new SubscribersA();
Subscribers b = new SubscribersB();
xinhua.add(a);
xinhua.add(b);
xinhua.notifySubscribers("2018来了");
}
}


Observable是java实现观察者模式的一种方式,被观察者需要继承Observable,观察者实现Observer接口。

被观察者

//学生,被观察者,继承Observable(可以被观察的)
public class Student extends Observable {

public void study(){
System.out.println("学生:1+1=几");
setChanged();                  //只有调用setChanged()方法和并通知观察者notifyObservers(),观察者才会解释到通知,调用观察者内部update()方法
notifyObservers();
}
}


观察者

//观察者内部必须重写update()方法
public class Teacher implements Observer{

@Override
public void update(Observable observable, Object object) {
//observable,被观察者可以直接把自己传递给观察者
//object,被观察者可以传递对象给观察者
System.out.println("老师:2");
}
}


测试类

public class Test {
public static void main(String[] args) {
Student student = new Student();  //创建一个被观察者
Teacher teacher = new Teacher();  //创建一个观察者
student.addObserver(teacher);     //把被观察者添加到观察者所观察的集合中
student.study();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  软件设计