在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;
}
}
我的理由是相信其策略模式而非观察者模式:
Button
类没有监听器列表(Observers)但只能有一个监听器。OnClickListener
类似于一种策略,其中用户代码实现了一旦单击按钮就要调用的策略(方法)。OnClickListener
的不同实现可以在运行时传递给Button
对象,并且可以在运行时更改行为。 (单击时相同的按钮可能会弹出一个OnClickListener
的实现,如果传递了另一个OnClickListener
实现,可能会向服务器发送请求。)以下是第293页的观察者模式的意图。
定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。
严格来说,代码示例当时不是Observer,因为一对多关系是一对一的。但是,根据第315页的意图,我不会将此称为策略。
定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。
从语义上讲,监听器不是算法;即响应事件与执行计算的目的不同。这个目的在语法上体现了onClick()
方法是void
,因此表现得更像听众。
出于这个原因,我会将代码示例称为Observer Pattern的简并形式。在我看来,观察者的尝试并不完全符合资格。我不会通过将其与另一种模式联系起来来尊重这种尝试。