这是一种策略模式还是一种回调?

时间:2018-09-12 18:43:11

标签: java android design-patterns

我今天读的是SOLID's Open/Closed Principle,我记得的第一个例子是 Android 支持库中的ViewDragHelper类。

这是课程的详细信息:

// allowing a user to drag and reposition views
public class ViewDragHelper {
    private final Callback mCallback;

    public static ViewDragHelper create(..., Callback cb)

    public abstract static class Callback {
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { }

        public int getViewHorizontalDragRange(View child) {
            return 0;
        }

        public abstract boolean tryCaptureView(View child, int pointerId);

        public int clampViewPositionHorizontal(View child, int left, int dx) {
            return 0;
        }
    }
}

我试图找出它是strategy pattern的实现。实际上看起来是这样。有ContextViewDragHelper类)和Strategy抽象(Callback类)。但是有两点:

  • 将策略的具体实施委托给图书馆的最终用户。
  • 策略实施的行为会影响Context(您可以在tryCaptureView方法中限制视图位置或禁止拖动操作),而在Strategy pattern描述中似乎出现了Strategy不会对Context产生任何影响(即仅产生或消耗一些数据)。

这是Strategy还是其他某种模式,或者仅仅是Callback这样的通用概念的实现?

1 个答案:

答案 0 :(得分:2)

  

这是Strategy还是其他某种模式,或者仅仅是Callback这样的通用概念的实现?

否,它不是classical definition中的策略模式,而是策略和Observer Pattern两者的结合。 ViewDragHelper的行为随着Callback的{​​{1}}和getViewHorizontalDragRange()实现(策略模式)而改变。并且clampViewPositionHorizontal()通过ViewDragHelperCallback实现(观察者模式)向ViewDragHelper的实例通知onViewPositionChanged()的当前状态。