Observer直译为中文为观察者。所以此模式又称为观察者模式(废话。)不过一直很疑惑,我感觉这个名字起得不好,给人误解很大,特别是初学者。我想大部分人的想法应该和我一样,我第一次看到观察者模式就会想到,观察者观察者,那么肯定观察者是主体了。其实不然。被观察者才是主体。
就小孩睡觉这个例子,如果按观察者的想法,那就观察嘛!!!怎么观察,小孩在睡觉,我就在那观察,他眼一睁,啊,要喝奶了。赶紧去泡奶粉。。。。这个显然就不正常。傻子才这么干。。。。
实际上是你该干嘛就干嘛去,小孩醒了,一哭要喝奶了,你就去泡奶吧。
所以我认为观察者模式叫Call模式或者Call-Response模式更恰当。
下面看程序,模拟找工作。。。。雇主通知他要招聘的雇员,雇员得到通知后做出响应。
先是两个接口,Employer和Employee。
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:31:33
* To change this template use File | Settings | File Templates.
*/
public interface Employer {
void agree_call();
void agree(Employee employee); //相当于swing里的add***Listener()
}
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:32:14
* To change this template use File | Settings | File Templates.
*/
public interface Employee {
void response(EmployEvent event);
//这个相当于ActiongListener里面的actionPerformed(ActionEvent event)
}
再来相应的实现类
package pig.pattern.Observer;
import java.util.List;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:32:51
* To change this template use File | Settings | File Templates.
*/
public class Employer_1 implements Employer{
private List<Employee> employees = new ArrayList<Employee>();
private EmployEvent event;
public void agree(Employee employee){
employees.add(employee);
}
public void agree_call() {
event = new EmployEvent();
event.setEmployer_name(this.getClass().getSimpleName());
for(Employee e : employees){
e.response(event);
}
}
}
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:49:22
* To change this template use File | Settings | File Templates.
*/
public class Employee_1 implements Employee{
public void response(EmployEvent event) {
System.out.println("Oh,I'm lucky.I'm employed by " + event.getEmployer_name());
}
}
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:49:22
* To change this template use File | Settings | File Templates.
*/
public class Employee_2 implements Employee{
public void response(EmployEvent event) {
System.out.println("Yeah,I'm employed by " + event.getEmployer_name());
}
}
再来事件类
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:39:48
* To change this template use File | Settings | File Templates.
*/
public class EmployEvent {
private String employer_name;
public String getEmployer_name() {
return employer_name;
}
public void setEmployer_name(String employer_name) {
this.employer_name = employer_name;
}
}
最后测试一下。
package pig.pattern.Observer;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-8-28
* Time: 14:51:00
* To change this template use File | Settings | File Templates.
*/
public class Test {
public static void main(String[] args){
Employer e_1 = new Employer_1();
e_1.agree(new Employee_1());
e_1.agree(new Employee_2());
e_1.agree_call();
}
}
Employer在众多的简历里面挑选出自己满意的,然后agree到自己的通知列中(list),全部都确认后,然后一起去call所有的这些应聘者,各个应聘者做出不同的反应。EmployEvent就相当于通知书一样,里面保存了Employer的名称,不然你怎么知道你是被哪个Employer聘了?
这还是说明,
观察者(Employee)并不是主体,被观察者(Employer)才是主体。如果Employee是主体,那是不是你投完简历以后就天天跟着那个Employer,他一天不做出决定,你就一天不停了?
至于用到哪儿,根据代码应该就能猜得出来。一个对象的改变会影响其他对象的响应,而且对象个数不确定。
很粗糙的代码,只想说别被名字唬到了。。。。
分享到:
相关推荐
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在帮助开发者深入理解和应用这些模式。下面我们将详细探讨Java设计模式及其在实际开发中的应用。 1. **单例模式(Singleton...
在"head-first-design-pattern—02-observer-pattern"中,作者可能通过对比错误的实现和标准的实现方式来深入解释观察者模式的核心概念。错误的实现通常会暴露出模式在实际应用中可能遇到的问题,如效率低下、代码...
总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。
本文将通过Java类库中的实例,深入浅出地介绍设计模式,并特别地阐述了观察者模式(Observer Pattern)的使用和实现。 首先,设计模式的核心在于经验的分享和传承。它是对某一类问题的通用解决方案,可以有效地避免...
观察者模式 行为模式 在对象之间定义一对多的依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖关系。 在此示例中,我们要监视节点上的子创建/删除事件(可用于监视文件夹) 源代码源于以下UML图:
"DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...
- **观察者模式(Observer Pattern)**:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 #### 系统架构设计 系统架构设计是软件工程的重要组成部分,它...
本资料“Unity-Design-Pattern-master.zip”聚焦于将设计模式应用于Unity游戏开发,通过实例解析,帮助开发者提升代码质量和可维护性。 在Unity中,设计模式的应用有助于优化项目结构,提高代码复用,以及更好地...
行为型模式如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、命令(Command)、迭代器(Iterator)、访问者(Visitor)、备忘录(Memento)、状态(State)、职责链(Chain of Responsibility...
在"Observer HeadFirst design pattern"中,作者通过生动的比喻和互动式的例子,帮助读者深入理解观察者模式的核心概念和实现方式。 观察者模式的核心思想是将"主题"(Subject)与"观察者"(Observer)解耦,主题...
本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...
在给定的“com.designpattern.state_observer.rar”压缩包中,我们可以期待找到有关“状态模式(State Pattern)”和“观察者模式(Observer Pattern)”的示例代码或教程。这两种模式都是行为设计模式,它们在处理...
本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...
设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可...通过学习DesignPatterns.pdf文档,开发者能够深入理解这些模式,从而在实际项目中更高效地进行设计和编码。
"Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...
《Pro Design Patterns in Swift》是一本专注于...通过学习《Pro Design Patterns in Swift》这本书,开发者不仅可以掌握各种设计模式,还能深入了解如何在实际项目中有效地应用它们,从而提升开发效率和软件的稳定性。
它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式(AbstractFactoryPattern)、观察者模式(ObserverPattern)、...
### Design Pattern 简明手册知识点详述 #### 一、接口型(interface)模式 **1. Adapter(适配器模式)** - **定义**:允许一个类接口与另一个不兼容的类接口协同工作。 - **分类**: - **继承型Adapter**:通过...
这个"design-pattern-in-java"项目中的代码示例涵盖了以上所有设计模式,通过实际的Java代码,你可以更直观地理解这些模式的工作原理,并学习如何在自己的项目中应用它们。设计模式的掌握对于提升代码质量、可维护性...