它是否仍然是没有观察者和主题接口的观察者模式?这是一个我不确定的例子

时间:2014-10-02 02:33:22

标签: java oop design-patterns observer-pattern observers

我学习面向对象的设计模式,但如果我只有具体的听众和主题,那就不明白为什么这不是观察者模式。在我的实践示例中,我创建了一个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办公室满意。这不是观察者模式吗?

enter image description here

2 个答案:

答案 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,即多态性