场景
小王的team最近收到了一个新的需求,设计一个机器学习探测网络攻击的框架。机器学习包括随机森林,聚类,关联规则,SVM,线性回归;网络攻击包括XSS,SQL注入,撞库,爬虫,CC攻击,扫描。
小王想了想,有两个方法:
- 做一个基本探测类,所有的机器学习方法类都继承这个基类,所有的攻击探测类都继承了机器学习类,这样每个代码都可以得到复用。
- 做一个基本探测类,所有机器学习方法都独立成类,所有网络攻击都独立成类。这样每次要用的时候,每个基本探测对象都包含一个机器学习方法对象和一个网络攻击对象。
而这里有两个原则:
- 找出变化并封装。
- 优先使用对象聚集而不是类继承。
总结
意图:将一组实现和另一组使用它的对象分离。
问题:一个抽象类的派生类必须使用多个实现,但不能出现类的数量爆炸性增长。
解决方案:为所有实现定义一个接口,供抽象类的所有派生类使用。
效果:实现与使用实现的对象解耦,提供了可拓展性,客户对象无需操心实现问题。