java设计模式-观察者模式

观察者模式介绍:
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

简单案例:
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程
在这里插入图片描述

抽象目标类 MySubject
MySubject是抽象目标类,在其中定义了一个ArrayList类型的集合observers,用于存储观察者对象,并定义了注册方法attach()和注销方法detach() ,同时声明了抽象的通知方法 cry()。需要注意的是attach()方法和detach()方法都必须针对抽象观察者进行编程,任何抽象观察者的子类对象都可以注册或注销。

package com.example.designmode.observeprattern;

import java.util.ArrayList;
import java.util.List;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 15:59
 **/

public abstract class MySubject {

    protected List observers = new ArrayList();

    /**
     * 注册方法
     *
     * @param observer
     */
    public void attach(MyObserver observer) {
        observers.add(observer);
    }

    /**
     * 注销方法
     *
     * @param observer
     */
    public void detach(MyObserver observer) {
        observers.remove(observer);
    }

    /**
     * 抽象通知方法
     */
    public abstract void cry();

}

抽象观察者类 MyObserver
抽象观察者MyObserver定义为一个接口,在其中声明了抽象响应方法response()。

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:02
 **/

public interface  MyObserver {
    /**
     * 抽象响应方法
     */
    void response();
}

具体目标类 Cat(猫类)
Cat是目标类MySubject 的子类,它实现了抽象方法 cry() ,在cry()中遍历了观察者集合,调用每一个观察者对象的response()响应方法。

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:05
 **/

public class Cat extends MySubject {
    @Override
    public void cry() {
        System.out.println("猫叫!");
        System.out.println("-----------------------------------------");

        for (Object obs:observers){
            ((MyObserver)obs).response();
        }
    }
}

具体观察者类 Mouse(老鼠类)
Mouse是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:05
 **/

public class Mouse  implements MyObserver {
    @Override
    public void response() {
        System.out.println("老鼠努力逃跑!");
    }
}

具体观察者类 Dog(狗类)
Dog也是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:05
 **/

public class Dog implements MyObserver {
    @Override
    public void response() {
        System.out.println("狗跟着叫!");
    }
}

编写客户端类测试
在客户端代码中需要实例化具体目标类和具体观察者类,先调用目标对象的attach()方法来注册观察者,再调用目标对象的cry()方法,在cry()方法的内部将调用观察者对象的响应方法。

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:17
 **/

public class Client {
    public static void main(String[] args) {
        MySubject subject=new Cat();

        MyObserver obs1,obs2,obs3;
        obs1=new Mouse();
        obs2=new Mouse();
        obs3=new Dog();

        subject.attach(obs1);
        subject.attach(obs2);
        subject.attach(obs3);

        subject.cry();
    }

}

在这里插入图片描述
观察者模式很好地体现了面向对象设计原则中的开闭原则。

如果需要增加一个观察者,如猪也作为猫的观察者,但是猫叫猪无须有任何反应,只需要增加一个新的具体观察者类,而对原有的类库无须做任何改动,这对于系统的扩展性和灵活性有很大提高。

新增观察者pig类

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:19
 **/

public class Pig implements MyObserver {
    @Override
    public void response() {
        System.out.println("猪没有反应!");
    }
}

在客户端代码中可以定义一个Pig实例,再将它注册到目标对象的观察者集合中,则需要增加如下代码:

package com.example.designmode.observeprattern;

/**
 * <h3>design-mode</h3>
 * <p></p>
 *
 * @author : ZhangYuJie
 * @date : 2022-04-24 16:17
 **/

public class Client {
    public static void main(String[] args) {
        MySubject subject = new Cat();

        MyObserver obs1, obs2, obs3, obs4;
        obs1 = new Mouse();
        obs2 = new Mouse();
        obs3 = new Dog();
        obs4 = new Pig();
        subject.attach(obs1);
        subject.attach(obs2);
        subject.attach(obs3);
        subject.attach(obs4);
        subject.cry();
    }

}

在这里插入图片描述
总结
观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值