使用OnClickListener()是策略模式的示例吗?

时间:2019-02-24 19:20:24

标签: java android oop design-patterns strategy-pattern

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类没有侦听器(观察者)列表,但只能有一个侦听器。
  2. 它一次将一部分方法委托给它的实例成员:侦听器。
  3. OnClickListener类似于一种策略,在该策略中,用户代码实现了一种策略(方法),一旦单击该按钮便会被调用。
  4. 可以在运行时将OnClickListener的不同实现传递给Button对象,并且可以在运行时更改行为。 (单击相同的按钮可能会显示弹出式窗口,其中包含OnClickListener的一个实现,并且如果传递了另一种OnClickListener的实现,则可能向服务器发送请求。)

1 个答案:

答案 0 :(得分:2)

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

  

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

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

  

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

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

因此,我将代码示例称为观察者模式的简并形式。在我看来,这似乎是一次不完全符合资格的观察员尝试。我不会通过将其与其他模式相关联来威严地进行尝试。