装饰模式的巧妙运用
背景:
IVirtualTool接口getConfig setConfig process
派生出各种算子,例如模板算子、找圆算子、找边算子
需要扩展功能:
依照模板匹配结果,含有坐标平移、旋转、伸缩、镜像、翻转等变换,所有算子要支持相应坐标变换
古老的实现:
提供一个坐标变换的基类,供所有算子在getConfig setConfig process 中调用
刚开始只实现平移和旋转,所有算子都调用了基类接口。
现在要扩展伸缩等变换,基类要修改和添加接口,导致所有算子要修改。
装饰模式实现:
把坐标变换做成一个独立算子,实现getConfig、setConfig、process。
所有算子按需安装坐标变换功能。
把坐标算子包装在外面,由它在坐标转换后调用各个业务算子,并且把坐标转换后的点列数据传给各个业务算子。
妙用1:
各个业务算子可以按需,安装或卸载坐标转换功能,只需要一行代码。
妙用2:
坐标转换需要扩展功能,只需要修改坐标转换一个算子,各个业务算子不用动,打到业务和坐标转换相互解耦。
妙用3:
业务算子(找边,找圆之类的)和坐标转换算子相互独立,使得彼此更易稳定。
如果坐标变换要扩展镜像等功能,只需要修改坐标变换算子,无需修改各个业务算子。