您的位置:首页 > 编程语言 > Java开发

java设计模式(十九)--观察者模式

2017-08-23 00:00 330 查看
对于观察者模式,其实就像广播站一样,他放出信息之后,人们就会都得到信息。这模式分为两部分:
被观察者:就是我上面所说的广播站
观察者:就是我上面说的得到信息的人们

网络上的专业解释:

当对象间存在一对多的关系时,则使用观察者模式,当一个对象被修改时,则会自动通知它的所有依赖对象。

实例:用此模式实现对电脑涨价降价人们的反应。

以下是我对此实例画的类图:



以下是我编写的代码:
1.创建被观察者类,包括广播信息,添加观察者等方法

public class Subject {
private static final List<Observer> observers=new ArrayList<>();
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
System.out.println("被观察者广播......");
broadcast();
}
public void broadcast(){
for(Observer item:observers){
item.updateInfo();
item.doSomething();
}
}
public void addObserver(Observer o){
observers.add(o);
}
}

2.编写观察者抽象类,用于被观察类信息的更新

public abstract class Observer {
protected Subject subject;
public Observer(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
public void updateInfo() {
System.out.println(subject.getInfo());
}
public abstract void doSomething();
}

3.编写观察者具体类的编写,用于实现不同具体类的需求

public class Observer_1 extends Observer {
public Observer_1(Subject subject) {
super(subject);
}
@Override
public void doSomething() {
System.out.println("我这个一号观察者不管降不降价都不会买

的......");
}
}

public class Observer_2 extends Observer {
public Observer_2(Subject subject) {
super(subject);
}
@Override
public void doSomething() {
System.out.println("我这个二号观察者不管涨不涨价都会买

的......");
}
}

4.编写测试类,测试被观察类是否可以正常广播信息以及观察这具体类是否可以正常接受信息

public class Test {
public static void main(String[] args) {
//新建一个被观察类
Subject subject=new Subject();
new Observer_1(subject);
new Observer_2(subject);
//信息广播
subject.setInfo("APPLE电脑降价了........");
//更换广播信息
subject.setInfo("APPLE电脑涨价了........");
}
}

5.后台输出:

被观察者广播......
APPLE电脑降价了........
我这个一号观察者不管降不降价都不会买的......
APPLE电脑降价了........
我这个二号观察者不管涨不涨价都会买的......
被观察者广播......
APPLE电脑涨价了........
我这个一号观察者不管降不降价都不会买的......
APPLE电脑涨价了........
我这个二号观察者不管涨不涨价都会买的......

在我自己角度看,这个模式在大型项目中应该会用的很少吧,他的确有优点:

1.它的广播性,他提供了一种一对多的对象设计方式。

2.它符合”开闭原则”,观察者扩展的时候只需继承观察者接口即可,我没有创建被观察者接口,创建接口之后扩展也是很方便的。

3.在被观察者和观察者之间我们实现了松耦合,虽然两者有简单的联系,但是两者只是通过一个观察者接口实现连接的,被观察者只知道这一个观察者接口集合,两者并不知道彼此的细节。

但是缺点也比较多,并且这些缺点造成的结果有点严重:

1.如果观察者过多的话,那么被观察者发送信息的时候就会花费更多的时间,降低系统性能。

2.如果两者之间有循环调用的话,再加上庞大的观察者的数量,那循环调用就会有好多,容易造成系统崩溃。

3.在优点的第三点,既是优点又是缺点,虽然实现了松耦合,但是观察者对于被观察者的实现就一问三不知了,观察者中没有相应的方法来知道被观察者信息改变的原理,只知道信息改变的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: