栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式--观察者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式--观察者模式

设计模式之观察者模式
  • 举例
  • 设计模式中的角色
    • 观察者
    • 被观察者
    • 观察者管理器
  • 观察者模式使用场景
  • 示例
    • 抽象观察方法
    • 设定三个观察者:学生、老师、厨师
      • 学生
      • 老师
      • 厨师
    • 观察者管理器
    • 测试执行和执行结果

举例

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

设计模式中的角色

观察者和被观察者。

观察者

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

被观察者

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

观察者管理器

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

观察者模式使用场景

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

示例 抽象观察方法
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 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);
    }
    
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号