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
类没有侦听器(观察者)列表,但只能有一个侦听器。 OnClickListener
类似于一种策略,在该策略中,用户代码实现了一种策略(方法),一旦单击该按钮便会被调用。OnClickListener
的不同实现传递给Button
对象,并且可以在运行时更改行为。 (单击相同的按钮可能会显示弹出式窗口,其中包含OnClickListener
的一个实现,并且如果传递了另一种OnClickListener
的实现,则可能向服务器发送请求。)答案 0 :(得分:2)
这是第293页中观察者模式的意图。
定义对象之间的一对多依赖关系,以便当一个对象 更改状态,其所有依赖项都会得到通知并自动更新。
严格来讲,代码示例不是观察者,因为一对多关系是一对一的关系。但是,按照第315页的意图,我也不会将其称为“策略”。
定义一系列算法,封装每个算法,并使它们可互换。 策略使算法可以独立于使用该算法的客户端而变化。
从概念上讲,侦听器不是算法;即,响应事件与执行计算的目的不同。这个目的在语法上体现在onClick()
方法是void
的地方,因此其行为更像一个侦听器。
因此,我将代码示例称为观察者模式的简并形式。在我看来,这似乎是一次不完全符合资格的观察员尝试。我不会通过将其与其他模式相关联来威严地进行尝试。