java设计模式学习之观察者模式

本文通过一个生动的例子介绍了观察者模式的原理及应用。利用火车乘务员与乘客的关系,详细阐述了观察者模式的设计思想,并提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.介绍

观察者模式(Observer Pattern)是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。属于类和类之间的关系,不涉及到继承,学习设计模式的时候应该记得归纳比较。
在实际生活中,比如我们乘坐卧铺,上车之后负责该车间的乘务人员会将你的卧铺票兑换成对应床铺的卡片,在快下车的时候,乘务人员会根据自己小本本上的卧铺车票过来通知你要下站了,这个过程中,乘客就是观察者,乘务人员是被观察者,实现的关键就是乘务人员手中的小本本,也就是代码中的ArrayList集合或者Vector集合。

2.代码示例

我们先创建一个乘客接口:

package com.tl.skyLine.pattern.ObserverPattern;

/**
 * Created by tl on 17/3/10.
 */
public interface Observer {
    void prepare();
}

实现两个具体的乘客,金刚狼Observer2和死侍Observer1:

package com.tl.skyLine.pattern.ObserverPattern;

/**
 * Created by tl on 17/3/10.
 */
public class Observer1 implements Observer {
    @Override
    public void prepare() {
        System.out.println("死侍停止吧嗒吧嗒说话,准备下车!");
    }
}
package com.tl.skyLine.pattern.ObserverPattern;

/**
 * Created by tl on 17/3/10.
 */
public class Observer2 implements Observer {
    @Override
    public void prepare() {
        System.out.println("金刚狼收起钛合金钢爪,准备下车!");
    }
}

火车上的乘务人员:

package com.tl.skyLine.pattern.ObserverPattern;

/**
 * 乘务人员,观察者模式中被观察者
 * Created by tl on 17/3/10.
 */
public interface Crew {
    /*增加观察者*/
    void add(Observer observer);

    /*删除观察者*/
    void del(Observer observer);

    /*通知所有的观察者*/
    void notifyObservers();

    /*自身的操作*/
    void operation();
}

乘务人员有很多方法,其中新增,删除,通知方法做的事是一样的,只有operation方法是不同的,比如有的乘务人员喜欢四处溜达,有的喜欢坐在自己的小房间里,还有的要出去卖东西赚外快, 等等等,所以我们先实现一个抽象类:

package com.tl.skyLine.pattern.ObserverPattern;

import java.util.Enumeration;
import java.util.Vector;

/**
 * Created by tl on 17/3/10.
 */
public abstract class AbstractCrew implements Crew {
    private Vector<Observer> vector = new Vector<Observer>();

    @Override
    public void add(Observer observer) {
        vector.add(observer);
        System.out.println("新增一位卧铺乘客提醒信息!");
    }

    @Override
    public void del(Observer observer) {
        vector.remove(observer);
        System.out.println("乘客已经下车!");
    }

    @Override
    public void notifyObservers() {
        Enumeration<Observer> enumo = vector.elements();
        while (enumo.hasMoreElements()) {
            enumo.nextElement().prepare();
        }
    }
}

具体16号车厢的乘务人员:

package com.tl.skyLine.pattern.ObserverPattern;

/**
 * 16号车厢的乘务员
 * Created by tl on 17/3/10.
 */
public class Crew16 extends AbstractCrew {
    @Override
    public void operation() {
        System.out.println("漫长的旅途,如此无聊,我先来几局王者农药吧!");
        notifyObservers();
    }
}

测试:

package com.tl.skyLine.pattern.ObserverPattern;

/**
 * Created by tl on 17/3/10.
 */
public class ObserverTest {

    public static void main(String[] args) {
        //创建被观察者
        Crew crew = new Crew16();
        //创建观察者1
        Observer1 observer1 = new Observer1();
        //创建观察者2
        Observer2 observer2 = new Observer2();
        crew.add(observer1);
        crew.add(observer2);
        crew.notifyObservers();
        crew.del(observer1);
        crew.del(observer2);
    }
}

输出:

新增一位卧铺乘客提醒信息!
新增一位卧铺乘客提醒信息!
死侍停止吧嗒吧嗒说话,准备下车!
金刚狼收起钛合金钢爪,准备下车!
乘客已经下车!
乘客已经下车!

很明显可以看到,乘客上车信息,到站之后,通知换票下车的完整个过程。

另外附一张从其它地方看到的观察者模式的关系图片:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值