设计模式--观察者模式

举例

以学校为例,学校中有学生、老师、校长、小餐厅厨师等角色,以学校铃声+时间作为角色监听事件。学校九点铃声,学生、老师、厨师到学校,校长不需要关注此铃声;学校十一点铃声,只有厨师关注此铃声,需要做饭;学校十二点铃声,学生、老师、校长到餐厅吃饭。

设计模式中的角色

观察者和被观察者。

观察者

示例中的学生、老师、校长、厨师都是观察者,观察铃声+当前时间。

被观察者

示例中的铃声+时间就是被观察者。

观察者管理器

观察者的数量不确认,因此需要观察者管理器保存所有的观察者,由观察者管理器监听事件,观察者管理器根据监听事件遍历执行观察者方法。

观察者模式使用场景

简单观察者属于同步执行监听方法。
使用观察者模式,属于多动脑子,少些代码。将冗余代码抽离,优化代码结构。

示例

抽象观察方法

public interface Observe {
    /**
     * 观察铃音方法
     */
    void observeVoice(int hour);
}

设定三个观察者:学生、老师、厨师

学生

public class StudentObserver implements Observe {
    @Override
    public void observeVoice(int hour) {
        if (hour == 9) {
            System.out.println("student go school");
            return;
        }
        if (hour == 12) {
            System.out.println("student eat");
            return;
        }
        if (hour == 18) {
            System.out.println("student go home");
            return;
        }
        System.out.println("student do nothing");
    }
}

老师

public class TeacherObserver implements Observe{

    @Override
    public void observeVoice(int hour) {
        if (hour == 9) {
            System.out.println("teacher go school");
            return;
        }
        if (hour == 12) {
            System.out.println("teacher eat");
            return;
        }
        if (hour == 18) {
            System.out.println("teacher go home");
            return;
        }
        if (hour == 20) {
            System.out.println("teacher study");
            return;
        }
        System.out.println("teacher do nothing");
    }
}

厨师

public class ChefObserver implements Observe {
    @Override
    public void observeVoice(int hour) {
        if (hour == 12) {
            System.out.println("chef help student and teacher eat");
            return;
        }
        if (hour == 14) {
            System.out.println("chef do dishes");
            return;
        }
        System.out.println("chef do nothing");
    }
}

观察者管理器

public class ObserverManager implements Observe {

    private List<Observe> observes;
    // 可以自定义移除方法
    public void addObserver(Observe observe) {
        if (this.observes == null) {
            this.observes = new ArrayList<>();
        }
        this.observes.add(observe);
    }

    @Override
    public void observeVoice(int hour) {
        this.observes.forEach(item -> item.observeVoice(hour));
    }
}

测试执行和执行结果

public class TestOberver {

    public static void main(String[] args) {
        ObserverManager manager = new ObserverManager();
        manager.addObserver(new StudentObserver());
        manager.addObserver(new TeacherObserver());
        manager.addObserver(new ChefObserver());
        manager.observeVoice(9);
        System.out.println("-------");
        manager.observeVoice(10);
        System.out.println("-------");
        manager.observeVoice(12);
    }
    /**
     * student go school
     * teacher go school
     * chef do nothing
     * -------
     * student do nothing
     * teacher do nothing
     * chef do nothing
     * -------
     * student eat
     * teacher eat
     * chef help student and teacher eat
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值