使用OnClickListener()作为策略模式的一个例子吗?

问题描述 投票:2回答:1

在android中OnClickListener是战略模式的一个例子吗?在另一个Stackoverflow中,question接受的答案称它是观察者模式。

类似的代码来理解这个问题。

public interface OnClickListener{
    void onClick(View view);
}

public class Button extends View{
    private OnClickListener listener;
    void clicked(){
        //some code
        if(listener != null){
            listener.onClick(this);
        }
        //some other code
    }
    public void setOnClickListener(OnClickListener listener){
        this.listener = listener;
    }
}

我的理由是相信其策略模式而非观察者模式:

  1. 在这里我们看到Button类没有监听器列表(Observers)但只能有一个监听器。
  2. 它将方法的一部分委托给其实例成员:一次一个侦听器。
  3. OnClickListener类似于一种策略,其中用户代码实现了一旦单击按钮就要调用的策略(方法)。
  4. OnClickListener的不同实现可以在运行时传递给Button对象,并且可以在运行时更改行为。 (单击时相同的按钮可能会弹出一个OnClickListener的实现,如果传递了另一个OnClickListener实现,可能会向服务器发送请求。)
java android oop design-patterns strategy-pattern
1个回答
2
投票

以下是第293页的观察者模式的意图。

定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。

严格来说,代码示例当时不是Observer,因为一对多关系是一对一的。但是,根据第315页的意图,我不会将此称为策略。

定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。

从语义上讲,监听器不是算法;即响应事件与执行计算的目的不同。这个目的在语法上体现了onClick()方法是void,因此表现得更像听众。

出于这个原因,我会将代码示例称为Observer Pattern的简并形式。在我看来,观察者的尝试并不完全符合资格。我不会通过将其与另一种模式联系起来来尊重这种尝试。

© www.soinside.com 2019 - 2024. All rights reserved.