23种设计模式:观察者模式

观察者模式

1.介绍

概念

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

主要作用

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

解决的问题

一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

使用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
(引用自菜鸟教程)

2.实现

背景

一家公司里面有许多员工正在摸鱼,一个观察者发现老板来了,就马上通知所有人,员工们马上开始努力工作。

实现步骤

1.创建观察者类。

public class Observer {
    //观察者数组
    private ArrayList<Staff> staffList = new ArrayList<>();

    //增加第一个观察者
    public void addStaff(Staff staff) {
        this.staffList.add(staff);
    }

    //删除第一个观察者
    public void removeStaff(Staff staff) {
        this.staffList.remove(staff);
    }

    //通知所有观察者
    public void notifyStaff() {
        for (Staff staff : staffList) {
            staff.update();
        }
    }
}

2.创建员工接口。

public interface Staff {
    //更新
    void update();
}

3.创建观察者的子类。

public class ObserverStaff extends Observer{
    public void doSomething() {
        System.out.println("老板来了!");
        super.notifyStaff();
    }
}

4.创建员工接口的实现类。

public class StaffOfThisCompany implements Staff{
    @Override
    public void update() {
        System.out.println("收到,停止摸鱼!");
    }
}

4.创建测试类

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Staff staff1 = new StaffOfThisCompany();
        Staff staff2 = new StaffOfThisCompany();
        Staff staff3 = new StaffOfThisCompany();

        ObserverStaff observer = new ObserverStaff();
        observer.addStaff(staff1);
        observer.addStaff(staff2);
        observer.addStaff(staff3);

        observer.doSomething();
    }
}

5.运行结果

老板来了!
收到,停止摸鱼!
收到,停止摸鱼!
收到,停止摸鱼!

posted @ 2021-09-26 11:04  Dawnlight-_-  阅读(40)  评论(0编辑  收藏  举报