lab3方案四五六的实现思路和遇到问题

方案四:
为每个接口分别构造一个实现类,该类一方面继承 CommonIntervalSet 中的全局共性操作,另一方面在该类中完成对局部共性操作的代码,通过层层继承实现功能的复用。
以利用了CommonIntervalSet的是排班应用DutyRosterApp为例(NonPeriodicAndNoBlankAndNonOverlapIntervalSetImpl通过层层继承实现了非周期性、无空白、不重叠的额外功能):
(1)public class NonOverlapIntervalSetImpl
extends CommonIntervalSet
implements NonOverlapIntervalSet
在这里插入图片描述

(2)public class NoBlankAndNonOverlapIntervalSetImpl
extends NonOverlapIntervalSetImpl
implements NoBlankIntervalSet
在这里插入图片描述

(3)public class NonPeriodicAndNoBlankAndNonOverlapIntervalSetImpl
extends NoBlankAndNonOverlapIntervalSetImpl
implements NonPeriodicIntervalSet
(4)public class DutyIntervalSet extends NonPeriodicAndNoBlankAndNonOverlapIntervalSetImpl
(5)static DutyIntervalSet duty=new DutyIntervalSet<>()

方案五:
利用委托机制,还是以DutyRosterApp为例,在DutyIntervalSet中创建非周期性、无空白、不重叠的实现类的引用,然后在构造方法中将对象赋值给它们。
这里遇到了一个问题,就是譬如检查空白这个功能
@Override
public void checkNoBlank() {… //检查是否有空白
nbis.checkNoBlank();
}
指导书上给出的实现类public class NoBlankIntervalSetImpl implements NoBlankIntervalSet与原本的CommonIntervalSet并没有建立起直接的联系,那它对谁检查空白呢。
后来想到可以在NoBlankIntervalSetImpl的构造方法中将CommonIntervalSet的List<Interval> intervalList传递进来给内部成员引用,然后在DutyIntervalSet的构造方法中传参new NoBlankIntervalSetImpl(super.getIntervalList),完成之前的问题。

方案六:
方案六采用的是decorator模式,选取CommonIntervalSet作为decorator的实现基本功能的类,抽象基类AbstractDecorator类需要用CommonIntervalSet类(实现IntervalSet)实现共用功能,利用委托在构造函数导入这个类的对象,然后通过该对象调用函数实现共性功能。
每次我们要添加一个新功能都创建一个新的类继承抽象基类AbstractDecorator,每个函数原有功能用super调用,新功能自己实现。每一个功能类的构造函数都要利用委托导入一个IntervalSet的实现类(用其完成对父类构造函数的调用)。
client端实现的时候,要利用递归的思想,像下面一样
IntevalSet i= new NoBlankIntervalSetImpl(
new NonOverlapIntervalSetImpl(
new NonPeriodicIntervalSetImpl(new CommonIntervalSet()))
由里向外,层层展开,实现共性与个性功能的结合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值