java 设计模式---->观察者模式

本文通过一个生动的例子——公交车上的乘客动态变化,详细介绍了观察者模式的实现方式及其应用场景。展示了如何利用观察者模式来实现对象间的一对多依赖关系。

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


为什么我们会选择观察者模式呢:

如果一个对象的数值或者状态发生变化,依赖于他的很多的对象的都需要跟随发生变化.如果依赖他的对象非常多.那么观察者是我们首先考虑的模式之一

今天我们讲解观察者模式:举个简单的例子说明.

就拿我们早上挤公交车来说:

观察者:代表自己以及其他向挤上公交车的人.

被观察者:就是公交车.

当然这个例子举的有点不恰当,那就是 公交车的位置跟坐标的变化是没办法通知到我们的,我们只能够了解到眼前的情况,除非你公交车公司有人哈哈.

下面的情况 假设我们有公交车定位系统 就拿这个例子说明我们的观察者模式:

主题类图如下:

好了直接写方法了:

/**
 * 公交车 被观察者类
 * @author 0001
 *
 */
public class Bus extends Observable{
    //位置的改变
    public void position(){
        this.trace("公交车位置发生变化");
        super.setChanged();//通知所有观察者
        super.notifyObservers("公交车慢悠悠的爬过来");
    }
    //人数的变化
    public void personChange(){
        this.trace("人数已10的N次方不断的暴增");
        super.setChanged();
        super.notifyObservers("向上的车的准备战斗了,已经超载了");
    }
    public void trace(String message){
        System.out.println(message);
    }
}

观察者类:

/**
 * 一定一类人
 * @author 0001
 *
 */
public interface PersonCategory {
    public void reportBoss(String context);
}

/**
 * 定义上班族
 * @author 0001
 */
public class OfficeWork implements Observer,PersonCategory{
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("好不容易等来公交车");
        this.reportBoss(arg.toString());
    }
    public void reportBoss(String context) {
        // TODO Auto-generated method stub
        System.out.println("给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了");
    }
    
}

/**
 * 小偷
 */
import java.util.Observable;
import java.util.Observer;
public class Thief implements Observer,PersonCategory{
    public void reportBoss(String context) {
        // TODO Auto-generated method stub
        System.out.println("报告老板 ,偷了一部Iphone 4s,5s哦");
    }
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("马上开工了");
        this.reportBoss(arg.toString());
    }

}


测试类:

import java.util.Observer;

public class ClientTest {
    public static void main(String args[]){
        PersonCategory pcDemo=new OfficeWork();
        Bus bus=new Bus();
        bus.addObserver((Observer) pcDemo);
        bus.personChange();
        System.out.println("==================================>");
        //小偷
        PersonCategory thiefDemo=new Thief();
        bus.addObserver((Observer) thiefDemo);
        bus.personChange();
    }
}
输出结果

人数已10的N次方不断的暴增
好不容易等来公交车
给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了
==================================>
人数已10的N次方不断的暴增
马上开工了
报告老板 ,偷了一部Iphone 4s,5s哦
好不容易等来公交车
给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了

分析结果:

所有的观察者都会受到被观察者发出来的信息.









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值