【
观察者模式应用场景举例】
比如在玩“极品飞车”这款游戏,每一个车手到达终点的时候,都会在其它车手的屏幕上显示:某某人以多少时间到达终点的提示,其实这就是一个典型的观察者模式的应用,观察者模式即是典型的双向一对多的应用场景下用一的一端来通知多的一端。
=============================================
从另一篇文章中摘录的比较到位的说明:
什么时候用观察者模式?
<wbr>就是当一个对象改变时需要通知其它对象的时候。<br><wbr>GOF给出了以下使用观察者模式的情况:<br>
1)当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。<br>
2)当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。<br>
3)当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。<br>
其实观察者模式同前面讲过的桥梁、策略有着共同的使用环境:将变化独立封装起来,以达到最大的重用和解耦。观察者与后两者不同的地方在于,观察者模式中的目标和观察者的变化不是独立的,而是有着某些联系。<br><span style="font-weight:bold">为什么要用观察者模式?</span><br><wbr>主要是能够很好的解耦.</wbr></wbr></wbr>
=============================================
【观察者模式解释】
类型:行为模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有的观察者对象,使它们能够自己更新自己。
【观察者模式UML图】
【观察者模式-JAVA代码实现】
新建抽象发布通知父类:
packagecarer_subject;
importjava.util.ArrayList; importjava.util.List;
importcarer_observer.carer_observer;
publicinterfacecarer_subject_parent{
publicvoidset_state(Stringstate_string);
publicStringget_state();
publicvoidadd_observer(carer_observercarer_observer_ref);
publicvoidsub_observer(carer_observercarer_observer_ref);
publicvoidnotityAllCarer();
} |
新建发布通知实现类:
packagecarer_subject;
importjava.util.ArrayList; importjava.util.List;
importcarer_observer.carer_observer;
publicclasscarer_subject_subimplementscarer_subject_parent{
List<carer_observer>list_observer=newArrayList<carer_observer>();
privateStringstate;
publicvoidset_state(Stringstate_string){ this.state=state_string;
}
publicStringget_state(){ returnstate;
}
publicvoidadd_observer(carer_observercarer_observer_ref){
list_observer.add(carer_observer_ref);
}
publicvoidsub_observer(carer_observercarer_observer_ref){
list_observer.remove(carer_observer_ref);
}
publicvoidnotityAllCarer(){
state="到达终点"; for(inti=0;i<list_observer.size();i++){
list_observer.get(i).show_info();
}
}
} |
新建观察者接口:
packagecarer_observer;
importcarer_subject.carer_subject_parent;
publicinterfacecarer_observer{
publicvoidshow_info();
} |
新建观察者实现类:
packagecarer_observer;
importcarer_subject.carer_subject_parent;
publicclasscarer_observer_impleimplementscarer_observer{
privatecarer_subject_parentcarer_subject_parent_ref;
publiccarer_subject_parentgetCarer_subject_parent_ref(){ returncarer_subject_parent_ref;
}
publicvoidsetCarer_subject_parent_ref(
carer_subject_parentcarer_subject_parent_ref){ this.carer_subject_parent_ref=carer_subject_parent_ref;
}
publiccarer_observer_imple(carer_subject_parentcarer_subject_parent_ref){ super(); this.carer_subject_parent_ref=carer_subject_parent_ref;
}
publicvoidshow_info(){
System.out.println(carer_subject_parent_ref.get_state());
}
} |
新建客户端运行类:
packagerun_main;
importcarer_observer.carer_observer_imple; importcarer_subject.carer_subject_parent; importcarer_subject.carer_subject_sub;
publicclassrun_main{
publicstaticvoidmain(String[]args){
carer_subject_parentcarer_subject_parent_ref=newcarer_subject_sub();
carer_observer_implecarer_observer_imple_ref1=newcarer_observer_imple(
carer_subject_parent_ref);
carer_observer_implecarer_observer_imple_ref2=newcarer_observer_imple(
carer_subject_parent_ref);
carer_observer_implecarer_observer_imple_ref3=newcarer_observer_imple(
carer_subject_parent_ref);
carer_observer_implecarer_observer_imple_ref4=newcarer_observer_imple(
carer_subject_parent_ref);
carer_subject_parent_ref.add_observer(carer_observer_imple_ref1);
carer_subject_parent_ref.add_observer(carer_observer_imple_ref2);
carer_subject_parent_ref.add_observer(carer_observer_imple_ref3);
carer_subject_parent_ref.add_observer(carer_observer_imple_ref4);
carer_subject_parent_ref.sub_observer(carer_observer_imple_ref3);
carer_subject_parent_ref.set_state("到达终点");
carer_subject_parent_ref.notityAllCarer();
}
} |
程序运行结果如下:
以一对多的方式进行对一方状态的改变而去通知多方,观察者模式也叫发布/订阅模式,一方进行发布,而多方进行订阅,和生活中看报纸一样,你喜欢订城市晚报,就会发给你。
分享到:
相关推荐
- 包括策略模式(Strategy)、观察者模式(Observer)、责任链模式(Chain of Responsibility)、迭代器模式(Iterator)、命令模式(Command)等,它们关注对象之间的交互和职责分配。 设计模式不仅提供了标准化...
- **定义**: 观察者模式是一种行为型设计模式,定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - **优点**: 支持广播通信。 - **实现**: - **Subject类...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
以上只是23种设计模式中的一部分,其他还包括代理模式、装饰模式、观察者模式、迭代器模式、命令模式、责任链模式、备忘录模式、状态模式、策略模式、模板方法模式、访问者模式、享元模式、组合模式等。每种模式都有...
通过以上模式的介绍,我们可以看到,设计模式并不是空洞的理论,它们来源于日常生活的观察和思考,能够有效地解决软件开发中的常见问题。理解和应用这些模式,可以提高代码的可读性、可维护性和灵活性,是每位程序员...
这里没有列出具体的例子,但它们包括策略模式(Strategy)、观察者模式(Observer)、迭代器模式(Iterator)等,这些模式在处理对象行为和协作时非常有用。 总的来说,设计模式是编程中的一种智慧结晶,它们在实际...
这个系统的设计需要结合多种设计模式,以确保灵活性、可扩展性和代码复用性。以下是一些关键的知识点和实现策略: 1. **工厂模式**:用于创建不同类型的快餐产品。例如,我们可以有一个`MealFactory`,它能根据用户...
在本论文中,主要采用了策略模式、观察者模式、装饰者模式、工厂模式、单例模式等设计模式来设计快餐店多功能点餐系统。这些模式在软件设计中起到了非常重要的作用,每种模式都有其特点和应用场景。 3. 软件体系...
腾讯校园招聘的产品笔试题目主要涵盖了数据分析、逻辑推理、数学计算以及商业策略等方面的知识点,旨在测试应聘者的综合素质和解决问题的能力。以下是对各个题型及其涉及的知识点的详细解析: 1. 图表资料分析:...
5. 观察者自身的偏见可能影响观察结果。 在进行营销研究时,观察法可以与问卷调查、深度访谈等其他研究方法结合使用,以获取更全面、深入的洞察。通过对消费者行为的直接观察,企业可以更好地理解市场需求,优化...
- **案例背景**:麦当劳通过全球扩张成为国际快餐业的领导者。 - **成功因素**:标准化与本土化相结合的策略。 ### 总结 通过对《MBA市场营销案例全集》的学习,我们可以深刻理解市场营销的各个方面,从理论到...
然而,我们不能简单地将在线教育视为传统教育的替代品,因为教育模式的选择取决于个体需求,如同选择快餐与正餐的差异。 首先,虽然在线教育提高了教育效率,但它并不意味着能够完全取代传统的面对面教学。教育的...
- **知识点:** 快餐店的特点及其服务模式。 - **解析:** 快餐店以其高效的服务流程和便捷的用餐体验而受到广泛欢迎,是现代城市生活中的重要组成部分。 **21. (C)是指有消费能力或潜在购买能力的个人和组织。**...
8. **设计模式**:在构建大型系统时,设计模式如单例、工厂、观察者等可以提高代码的可维护性和复用性。 9. **数据库连接**:如果系统需要持久化存储数据,可能需要通过JDBC(Java Database Connectivity)接口与...
9. **设计模式**:项目中可能会应用到常见的设计模式,如工厂模式(用于创建汉堡实例)、单例模式(用于全局访问某个对象,如店铺状态)或观察者模式(用于更新视图以反映模型的变化)。 10. **单元测试**:为了...
他们不仅是环境的创造者,还需要扮演观察者、引导者和支持者的角色。教师应关注幼儿在活动中的表现,适时提供隐性指导,鼓励幼儿自我探索,解决问题,培养他们的社交能力和情绪管理能力。 最后,区域活动与主题课程...
在实现业务逻辑时,Java 提供了多种设计模式,如单例模式(Singleton)、工厂模式(Factory)和观察者模式(Observer),这些可以帮助开发者更好地组织代码,提高代码的可维护性和复用性。对于处理订单和库存等业务...
在肯德基的案例中,他们可能假设中国消费者对于快餐的口味、价格、环境和服务有特定需求,然后通过调研验证这些假设。 科学方法的六个步骤在市场营销调研中得到了体现,通过问题的确定,假设的建立,到研究设计、...