设计模式之——观察者模式

一、基本介绍

观察者模式(行为型):指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,也叫订阅—发布模式。

二、包含角色

1.主题(监视)角色:提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,并在监视到变化时通知所有观察者的更新方法。

2.抽象观察者角色:定义了一个更新自己的方法的接口,当接到更改通知时被调用。

3.具体观察者:实现抽象观察者中定义的方法,以便在得到目标的更改通知进行自己的具体更新操作。

 

三、案例及UML类图

案例说明:

           每个学期都会有一次卫生检查,当收到领导来检查的消息时,老师们开始指挥学生们搞卫生,学生们进行卫生操作。

UML类图:

类ClassPerson:

public interface ClassPerson {

    void updata();
}

 

说明:班级人员接口,抽象观察者角色,定义了一个更新操作的方法。

类Student:

public class Student implements ClassPerson {
    @Override
    public void updata() {
        System.out.println("学生开始做卫生!");
    }
}

说明:学生类,具体观察者角色,实现更新方法,学生接到通知后开始做卫生。

类Teacher:

public class Teacher implements ClassPerson {

    @Override
    public void updata() {
        System.out.println("老师指挥学生做卫生!");
    }
}

说明:老师类,具体观察者角色,实现更新方法,老师接到通知后指挥学生们做卫生。

类Monitor:

public class Monitor {

    private List<ClassPerson> classPersonList = new ArrayList<>();


    /**
     * 添加需要通知的对象
     * @param classPerson 学校管理类
     */
    public void addObserver(ClassPerson classPerson) {
        classPersonList.add(classPerson);
    }

    /**
     * 通知所有观察者
     */
    public void notifyAllObservers() {
        for(ClassPerson classPerson : classPersonList) {
            classPerson.updata();
        }
    }
}

说明:监视类,主题(监视)角色,添加观察者,当通知到达后调用唤醒观察者的方法,让观察者自己进行更新操作。

类ObserverTest:

public class ObserverTest {

    public static void main(String[] args) {
        Monitor monitor = new Monitor();
        //添加老师作为通知对象
        ClassPerson teacher = new Teacher();
        monitor.addObserver(teacher);
        //添加学生作为通知对象
        ClassPerson student = new Student();
        monitor.addObserver(student);
        System.out.println("检查人员来了!");
        //进行通知
        monitor.notifyAllObservers();
    }
}

说明:测试及客户端。

 

四、适用场景

1.对象间存在一对多关系,且一个对象的状态发生改变会影响其他对象。

2.一个对象必须通知其他对象,而并不知道这些对象具体是谁。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值