我学习面向对象的设计模式,但如果我只有具体的听众和主题,那就不明白为什么这不是观察者模式。在我的实践示例中,我创建了一个DMV办公场景,其中包含一个名为DmvCounter和Customers(观察者)的主题。在我的主要方法中,客户构建了他们希望DMV办公室为他们完成的任务。
Customer bob = new Customer("Bob", "Register Vehicle", 201); // number is bob's order
Customer pat = new Customer("Pat", "Renew License", 202);
dmvObject.register(bob);
dmvObject.register(pat);
dmvObject.handleRequest(200); // nothing happens - no customer for this request number
dmvObject.handleRequest(202); // prints: "Pat says: Thank you - Renewed License"
我的问题是上面只是两个对象之间的进程间通信。观察者没有接口,没有主题接口。主题通知它已完成的特定订单号的具体客户列表。客户离开DMV办公室满意。这不是观察者模式吗?
答案 0 :(得分:0)
这是观察者模式的一个例子。
在典型的Observer实现中,主体维护一个家属列表,并通过调用每个家属的方法来通知这些家属。这就是你所描述的情况。
现在,您可以认为这不是Observer模式特别有用的实现,因为Observable对象不仅需要知道正在观察它的对象类型,还需要知道对象的方法签名。观察对象。这不是特别可扩展的,因为DmvCounter
以外的任何其他内容都无法观察到Customer
。
实现接口(例如java.util.Observer
)的好处是您可以添加任何类型的观察者而无需更改DmvCounter
,并且可以使用单个方法update(Observable o, Object arg)
通知所有观察者
答案 1 :(得分:0)
设计模式的概念坚持OOP的概念,因此每个设计模式必须包含尽可能多的OOP概念。在转向设计模式之前,你必须先了解OOP的概念,否则会很困惑。
那么为什么我们需要界面呢?答案是多态性。
想象你有另一个顾客,比如说customer2。然后在你的DmvCounter中,你必须为customer2实现所有这些功能:
public class DmvCounter() {
List<Customer> customer = new ArrayList<Customer>();
List<Customer2> customer2 = new ArrayList<Customer2>();
public void register(Customer customer) {
//do something
}
public void register(Customer2 customer2) {
//do something
}
现在假设您有100种类型的客户,并且每种类型的客户都可以完成相同的注册工作。如果你必须100次实现寄存器代码,那将是一项非常耗时且痛苦的任务。所以多态性的概念是:无论消费者是什么类型,它仍然是消费者,你只需要1个注册函数。
所以回答你的问题,是的,它仍然是一种观察模式。但它不是一种观察模式,因为它不符合OOP的要求,即OOP,即多态性