预付费手机合约装饰器模式UML类图解决方案相关疑问咨询
问题1:为什么Option类与Contract类之间同时存在一条虚线和一条实线?
这是装饰器模式的标准结构体现:
- 带空心三角箭头的虚线表示
Option作为抽象装饰器,实现了Contract接口(或继承自Contract抽象类),保证所有附加包装饰器和基础合约有完全一致的对外方法签名,满足需求里所有合约相关组件都支持三个指定方法的要求。 - 带空心菱形的实线是聚合关系,表示
Option内部持有一个Contract类型的被装饰实例,这样才能在调用getCharges()时叠加附加包资费,同时透传getBalance()、setBalance()调用到基础合约。
问题2:为什么Minutes(通话包)没有像Data(流量包)、SMS(短信包)一样作为单独类列出?
这是参考方案的绘图疏漏。需求明确将50分钟通话包列为4个可选附加包之一,逻辑上它和其他附加包一样,需要作为Option的具体子类存在,单独实现getCharges()返回1.5€的月度资费,不存在可以合并到其他类的设计理由。
问题3:为什么Phone类和DoubleTransfer类与其他类没有关联关系?
这也属于参考方案的绘图遗漏:
DoubleTransfer就是需求中提到的双倍传输速率包,它属于具体的附加包装饰器,应当和Data、SMS一样继承自Option类。Phone是作业要求的客户端类,按要求它需要持有一个Contract类型的实例,用来操作合约余额、查询总资费,正确设计中应当存在Phone到Contract的单向关联。
内容的提问来源于stack exchange,提问作者Mr. Hankey
相关产品推荐
相关产品推荐

