开闭原则
- 一个软件实体如类、模块和函数应该对外开放,对修改关闭,即不修改一个软件实体的基础上去拓展其功能
解读
- 用抽象构建框架,用实现扩展细节。
- 不以改动原有类的方式来实现新需求,而是应该以实现事先抽象出来的接口(或具体类继承抽象类)的方式来实现。
优点
- 实践开闭原则的优点在于可以在不改动原有代码的前提下给程序扩展功能。增加了程序的可扩展性,同时也降低了程序的维护成本。
类比
-
汽车类:
- 四个轮子
- 一个方向盘
- 顶盖
-
由于现代化生活的不断变化,出现了很多不同类型的汽车,比如工程车、救护车、赛车。
-
没有遵守开闭原则的设计
@interface Car : NSObject
@property(nonatomic,copy)NSString *steeringWheel; //方向盘
@property(nonatomic,copy)NSString *tyre; //轮胎
@property(nonatomic,copy)NSString *cover; //顶盖
//卡车大车厢
@property(nonatomic,copy)NSString *carriage; //车厢
//赛车尾翼
@property(nonatomic,copy)NSString *tail; //尾翼
//救护车医疗器械
@property(nonatomic,copy)NSString *medical; //医疗器械
@end
复制代码
- car类中声明了最初车的基本属性
- 轮子
- 方向盘
- 顶盖
- 按照需求我们在原来的车类中加入了新的属性
- 大车厢
- 医疗器械
- 赛车尾翼
- 这就导致了我们在创建实例化一个赛车类的时候会包含我们并不需要的成员属性,总不能在赛车上放大车厢和医疗器械吧。虽然我们可能没有去使用这些成员属性。
- 显然这样的设计并不是一个很好的设计
- 随着需求的增加,就需要反复的修改之前创建的类,car
- 同时也会给新增的类造成不必要的冗余
- 这个就是没有遵守修修改关闭,对扩展开发的开闭原则
遵守开闭原则的设计
- 基类car
@interface Car : NSObject
@property(nonatomic,copy)NSString *steeringWheel; //方向盘
@property(nonatomic,copy)NSString *tyre; //轮胎
@property(nonatomic,copy)NSString *cover; //顶盖
@end
复制代码
- 卡车类
@interface Truck : Car
@property(nonatomic,copy)NSString *carriage; //车厢
@end
复制代码
- 救护车类
@interface Ambulance : Car
@property(nonatomic,copy)NSString *medical; //医疗器械
@end
复制代码
- 赛车类
@interface Race : Car
@property(nonatomic,copy)NSString *tail; //尾翼
@end
复制代码
优点
- 1.随着车类型的增加,不需要反复修改最初的父类(Car),只需要新建一个继承自他的子类在子类中添加仅属于自己的属性和方法
- 2.每一种车的功能被分散到不同的子类中,每个子类的属性就没有任何的冗余
- 3.当我们对卡车类添加方法时,也没有影响到救护车和赛车。
UML类图对比
- 未遵守开闭原则
- 遵守开闭原则
##实践
- 在我们开发项目的之前要想清楚在这个场景下那些数据是不变的,那些事容易变动的。将容易变得的抽象车接口或者方法,以便在将来更好的应用不同的需求
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END