观察者模式

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

介绍:

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

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

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

优点:

 1、观察者和被观察者是抽象耦合的。

 2、建立一套触发机制。

缺点: 

1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

实现方式:

创建观察者(Student)接口:

/**
 * 学生接口类(抽象观察者)
 */
public interface Student {
    /**
     * 定义获取信息的方法
     */
    void getMsg(String msg);
}

创建具体观察者(ConcreteStudent)对象:

/**
 * 具体学生(角色:具体观察者)
 */
public class ConcreteStudent implements Student{
    private String sname;//姓名

    //有参构造函数
    public ConcreteStudent(String sname) {
        this.sname = sname;
    }

    /**
     * 重写获取信息的方法
     */
    public void getMsg(String msg) {
        System.out.println(this.sname + "接收到老师的信息是: " + msg);
    }
}
创建被观察者(Teacher)对象:

/**
 * 老师(被观察者)
 */
public class Teacher {
    //学生集合
    private List<Student> sList = new ArrayList<Student>();

    /**
     * 将学生集合添加到学生集合中
     */
    public void addStudent(Student student){
        sList.add(student);
    }

    /**
     * 发送信息功能
     */
    public void sendMsg(String msg){
        for (Student student : sList) {
            student.getMsg(msg);
        }
    }
}
创建观察者模式测试类ObserverMain
/**
 * 观察者模式测试类
 *
 * 观察者模式
 * 对象间一对多的依赖关系,当一个对象的状态发生改变时,
 * 所有依赖于它的对象都得到通知并被自动更新。
 */
public class ObserverMain {
    public static void main(String[] args) {
        //实例化多名学生对象
        Student xm = new ConcreteStudent("小明");
        Student xg = new ConcreteStudent("小刚");
        Student xh = new ConcreteStudent("小花");

        Teacher teacher = new Teacher();//实例化老师对象
        //为老师添加教授的学生
        teacher.addStudent(xm);
        teacher.addStudent(xg);
        teacher.addStudent(xh);

        //调用老师发送信息的方法
        teacher.sendMsg("今天晚上8点的直播课,大家准时参加!!");
    }
}

运行结果:

以上是我观察者模式的理解与实现。

如果有问题,还请批评指正。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐