更新时间:2022-04-11 10:41:45 来源:极悦 浏览634次
面向对象设计的原则是什么?极悦小编来告诉你。
SRP 要求一个类应该只有一个职责。
示例:如果一个类SalesOrder 保存有关销售订单的信息,并且另外有一个saveOrder()将其保存SaleOrder 在数据库中的方法和一个exportXML() 导出的方法,那么SalesOrder这种设计将违反 SRP,因为会有不同类型的用户类以及对此类进行更改的不同原因。对一种类型的用户进行的更改,比如更改数据库的类型,可能需要为其他类型的用户重新测试、重新编译和重新链接该类。
更好的设计是让SalesOrder 类只保存有关销售订单的信息,并有不同的类分别保存订单和导出订单。这样的设计将得到 SRP 的证实。
OCP 要求每个软件实体应该对扩展开放,对修改关闭。
示例: 假设一个OrderValidation 类有一个方法validate(Order order)被编程为根据一组硬编码规则验证订单。这种设计违反了 OCP,因为如果规则发生变化,则OrderValidation必须修改、测试和编译类。
更好的设计是让OrderValidation 类包含一个对象集合,ValidationRule 每个对象都有一个validate(Order order)方法(可能在Validation 接口中定义)来验证Order使用特定规则的方法,并且类的validate(Order order)方法OrderValidation 可以简单地遍历这些ValidationRule对象以验证顺序. 新设计将满足 OCP,因为如果规则发生变化,我们可以创建一个新ValidationRule 对象并在运行时将其添加到OrderValidation实例中(而不是添加到类定义本身)。
这也可以通过使用AbstractValidationRule具有可覆盖功能的基类的子类来实现validate(Order order)。子类可以在不改变基类功能的情况下以不同的方式实现该方法。
LSP 要求程序中的对象应该可以用它们的子类的实例替换而不改变该程序的正确性。
用户必须能够通过对基类的引用来使用子类的对象,而不会注意到任何区别。当通过其基类接口使用对象时,子类的对象不能期望用户遵守比基类要求的更强大的先决条件。
示例:假设一个Rectangle 类有两个实例变量height和width,以及一个方法,setSize(int a, int b)该方法设置height 为a和width。b假设Square是 的子类, 和为 来Rectangle 覆盖继承的方法。这种设计会违反 LSP。要看到这一点,请考虑客户端使用类型的引用变量调用 方法来分配不同的值和,然后立即验证是否正确设置了大小或正确计算了面积。如果变量引用heightwidthaRectanglesetSize()abRectangle对象而不是 Square对象。
事实证明,在 OO 编程中, aSquare 根本不是 a Rectangle,因为它的行为与 a 不同Rectangle。
ISP 要求客户端不应被迫依赖他们不使用的接口。
示例:假设图中所示的 Vehicle 接口是为客户设计的
这违反了 ISP,因为客户端被迫依赖于他们不使用的方法:HighWay不使用stopRadio() or ejectCD(),并且ParkingLot不需要accelerate()or ejectCD()。
更好的设计是为不同类型的客户端设计更小的接口,如下图所示
DIP 要求高层模块不应该依赖于低层模块,两者都应该依赖于Java抽象类。另外,抽象不应该依赖于细节,细节应该依赖于抽象。
示例:使一个类Button 与另一个 Lamp(因为 aLamp 有 aButton)违反了 DIP。更好的设计是将 AbstractButton 与 AbstractButtonClient 相关联,并将 Button 定义为 AbstractButton 的子类,将 Lamp 定义为 AbstractButtonClient 的子类。
示例:EBookReader 使用classPDFBook是违反DIP的,因为它需要更改EBookReader class才能阅读其他类型的电子书。一个更好的设计是让EBookReader 使用一个接口EBook并让PDFBook 其他类型的电子书类实现EBook。现在添加或更改电子书课程将不需要对EBookReader 课程进行任何更改。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习