子类沙盒的目的:使用一个基类提供的操作集合进而在子类中定义行为。一个基类定义了一个抽象的沙盒方法和一些提供的操作。通过设置他们为保护状态来保证它们仅供子类使用,每个继承的沙盒子类针对父类提供的操作来实现沙盒函数。将所有的耦合都聚集到基类,子类就明显地与其他类更加独立。
当你发现基类有大量子类的时候,这意味着数据驱动的方法可能更适合。找到一种定义数据的行为的方法,而不是用大量的代码来定义。
使用情境:
1.你有一个带有大量子类的基类
2.基类能够提供所有子类可能需要执行的操作集合
3.在子类之间有重叠的代码,你想让它们之间更容易地共享代码
4.你想使这些继承类和程序的其他代码之间的耦合最小化
当你有一堆与外部系统耦合的继承类的话,那么就可以使用这个模式,通过把耦合向上移到一个提供的操作,从而把它聚集到基类。但这样会使基类越来越大和越来越难以维护。
当你的基类塞满了大量的方法,您能够通过转移一些函数到其他类中来缓解这种情况,在基类中提供的函数返回这些对象之一。
基类经常需要一些数据来封装和保护对子类的隐藏,基类获取需要状态的方法:
1.把它传递到基类构造函数,这样每个子类都需要调用基类的构造函数来传递该参数,这样会将不期望的状态暴露给每个子类,同时也存在维护成本
2.通过二级初始化来避免通过构造函数传递所有的东西,构造函数将不带参数仅仅创建对象,调用基类中的函数来传递它需要的余下部分数据
3.如果所需状态是单例,每个实例都将共享同样的状态,此时这个状态对基类是私有的也是静态的,其就只需要初始化一次
4.通过服务定位器模式将其需要的状态拉进去处理