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

标签 java android oop design-patterns strategy-pattern

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

最佳答案

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

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

严格来说,代码示例并不是一个观察者,因为一对多的关系更像是一对一的关系。然而,根据第 315 页的 Intent ,我也不会将其称为策略。

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,因此其行为更像监听器。

出于这个原因,我将代码示例称为观察者模式的退化形式。在我看来,这就像观察家的一次尝试,但并不完全符合资格。我不会通过将这种尝试与另一种模式联系起来来荣耀它。

关于java - 使用 OnClickListener() 是策略模式的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54855594/

相关文章:

java - Web 客户端中的 ClassCastException

android - 编译版本与最低要求版本 Android

java - 具有解析推送通知的 Android M 权限

php - 在静态函数中访问公共(public)/私有(private)函数?

java - 字符串和 StringBuffer

java - Spring in Action III-1第1章示例,应用无法正常运行

php - 快速 OOP 问题 - PHP

java - 在类构造函数中存储数据时遇到问题,学习 OOP

java - Raster.getPixels() 返回什么?

android - Iappcompat v21 : material design ActionBar() InflateException error-inflating-class