方案四:
为每个接口分别构造一个实现类,该类一方面继承 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()))
由里向外,层层展开,实现共性与个性功能的结合。