上次说到需求开始提出不同的订单数据需要差异化地显示,如 Amazon 订单,要把 Amazon 订单的独特性显示出来。我们分析过数据后,有必要把共性的数据抽取出来(所谓平台中立的数据),有别于平台特有的字段。
订单明细的显示,分开两个区域:
- 一个区域显示通用字段
- 一个区域显示平台特有字段
根据贡献的思维方式,[平台特有区域]就是需要贡献的地方。
UI变更
前台无论用什么技术实现,贡献式编程的思维没有不同。我们就假设用最简单的UI技术:HTML。
在第一版的时候就有个明细界面,现在就根据需要划分成为两部分。要显示平台特有字段的,大概就是一个<div>区域。在DIV中嵌入平台插件所贡献的部分。
第三版
OrderSystem多定义一个接口:IDisplayPart,这个 IDisplayPart 定义为一个可以输出 HTML 的函数:
HTML render(Order order);
OrderSystem现在有两个可被贡献的部分:
- IOrderDownloader
- IDisplayPart
我们开始觉得这两个接口有些共同点,就是添加一个平台大概都需要实现这两个接口,简单的我们可以一个对象实现了两个接口。不过这样不利于之后的扩展:如处理流程的不同。我们决定用一个类封装一下。IPlatformPlugin。这个 IPlatformPlugin 提供这两个接口:
public interface IPlatformPlugin {
/**
* 负责提供OrderDownloader实现类
*/
IOrderDownloader getOrderDownloader();
/**
* 负责提供IDisplayPart实现类
*/
IDisplayPart getDisplayPart();
}
好!贡献的粒度扩大了。前一个版本只是贡献单个接口,现在就可以提供多几个接口了。
结果是:
- OrderSystem 定义了 IPlatformPlugin
- Amazon、eBay等JAR实现了 IPlatformPlugin 和 需要的接口:IOrderDownloader 和 IDisplayPart
- 界面通过订单的不同类型,来选择应用不同的 IDisplayPart 来显示这个特别区域
真正可以下班了!