观察者模式

2019-08-05  本文已影响0人  SunnyGL

记得高一那会,我是我们组的组长,我们座位是那种七八个人围在一起拼成一张大桌子的那种(课间可以把书一撤,直接摆瓜子零食high起来,哈哈)。

某天下午的自习课,外面知了声加一圈一圈慢悠悠旋转的风扇使得人有些心烦意乱,我们组的张某人瞥了我一眼,小声对我说了句:“组长,我睡了哈,班主任来了叫我。”“你妹的,一到自习课你就睡,期末考试又要拖我们组后腿。”我对这位张同学真的是实在没办法,班级倒数,我话还没说完,他就已经趴头睡了。这时,我旁边的王同学把没做完的习题一摊,歪过头用她水汪汪的大眼睛看着我:“我也睡一会哈,班主任来了记得叫我。”我每天面对着这群不思进取的组员,真的是恨铁不成钢,每天想着法儿希望组员之间能够互帮互助,共同进步,结果就是肯努力的仍然继续努力,该混吃等死的还是在混吃等死。

过了许久,只见窗户外有一个穿着黑衣服的中年男人径直向教室走过来,我敏锐的觉察到肯定是班主任来了,我赶紧忙戳王同学和张某人:“班主任来了!”

课间————
”组长,刚才自习课多亏了您老人家,这包辣条分你一半,算我孝敬你的。“
”唉,你们能少睡点觉,成绩能提高一点,就不至于太拖小组平均分了。“
”组长,我保证下次一定不睡了好不好?好好学习,向组长您看齐!“

如今细想起来,上面这段记忆,正符合设计模式中的《观察者模式》呀,下面就用代码去描述一下上面的观察者模式。

1.我要把班主任来了这个事件告知张某人和王同学,首先定义一个事件回调接口。

/**
 * “班主任来了”事件回调接口
 */
public interface TeacherComeListener {

    /**
     * 班主任来啦
     */
    void onTeachCome(String msg);
}

2.接下来实现张某人和王同学对象类,他们都需要知道班主任来了这个事件,自然要实现TeacherComeListener接口。

/**
 * 张同学
 */
public class ZhangStudent implements TeacherComeListener{

    // 姓名
    private String name;

    public ZhangStudent(String name) {
        this.name = name;
    }

    @Override
    public void onTeachCome(String msg) {
        System.out.println(name + ":" +  msg);
    }
}

/**
 * 王同学
 */
public class WangStudent implements TeacherComeListener {

    // 姓名
    private String name;

    public WangStudent(String name) {
        this.name = name;
    }

    @Override
    public void onTeachCome(String msg) {
        System.out.println(name +":" + msg);
    }
}

3.张某人和王同学都对组长说了,让我在班主任来了第一时间叫醒他们,那我就应该持有他们实现的TeacherComeListener接口,下面是组长类。

public class GroupLeader {

    private List<TeacherComeListener> listenerList = new ArrayList<>();

    public GroupLeader() {
    }

    /**
     * 组员告诉组长,班主任来了通知一下
     * @param listener 组员实现的事件回调接口
     */
    public void regist(TeacherComeListener listener) {
        listenerList.add(listener);
    }

    /**
     * 通知张某人和王同学
     */
    public void notifyTeachComeEvent(){
        for (TeacherComeListener listener : listenerList) {
            listener.onTeachCome("班主任来啦!");
        }
    }
}

4.最后我们写代码测试一下

public class Test {
    public static void main(String[] args){

        // 张某人
        ZhangStudent zhangStudent = new ZhangStudent("张某人");
        // 王同学
        WangStudent wangStudent = new WangStudent("王同学");
        // 组长
        GroupLeader groupLeader = new GroupLeader();

        // 张某人对组长说,班主任来了叫我哈
        groupLeader.regist(zhangStudent);
        // 王某人对组长说,班主任来了叫我哈
        groupLeader.regist(wangStudent);

        // 过了一会,班主任来啦,组长快叫醒组员
        groupLeader.notifyTeachComeEvent();
    }
}

打印结果:

张某人:班主任来啦!
王同学:班主任来啦!

尾巴:
送上一张UML图,希望能够更加直观的理解观察者模式。

观察者模式.png
上一篇 下一篇

猜你喜欢

热点阅读