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

Is using OnClickListener() an example of Strategy pattern?

OnClickListener in android an example of Strategy pattern ? In another Whosebug 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 class没有listeners(Observers)但只能有一个listener。
  2. 它将方法的一部分委托给它的实例成员:一次监听器。
  3. OnClickListener 类似于一种策略,其中用户代码实现一种策略(方法),一旦单击按钮就会被调用。
  4. OnClickListener 的不同实现可以在 运行 期间传递给 Button 对象,并且可以在 运行 期间更改行为。 (单击相同的按钮可能会显示一个带有 OnClickListener 实现的弹出窗口,如果传递了 OnClickListener 的另一个实现,则可能会向服务器发送请求。)

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

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

严格来说,代码示例不是观察者,因为一对多关系是一对一。但是,根据第 315 页的意图,我也不会将其称为策略。

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

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

因此,我将代码示例称为观察者模式的 退化 形式。在我看来,它像是一个不完全符合条件的观察者尝试。我不会通过将它与另一个模式相关联来美化这种尝试。