导论(杂)

面向对象的设计模式【应对变换,提高复用】
面向对象:类与通信对象之间的组织关系
封装(隐藏内部实现)
继承(复用)
多态(改变对象行为)

源代码就是设计
设计模式(使用重构得到模式)
(设计模式不等于技巧,不能直接拿来用)

例子:
需求设计一个员工系统,其中功能之一是计算不同职位员工当月工资的功能,不同职位计算方式不同。

结构化设计
enum EmploypeeType
{
Engineer;
Sales;
Manager;

}
计算工资的程序
if(type == EmployeeType.Engineer)
{…}
else if(type == EmploypeeType.Sales)
{…}

面向对象的设计
abstract class Employpee
{public abstract int GetSalary();}
class Enginner:Employpee
{
public override int GetSalary(){…}
}
class Sales:Employpee
{
public override int GetSalary(){…}
}
显示工资的程序
Employee e=emFactory.GetEmploypee(id);//返回一个类
MessageBox.Show(e.GetSalary());

现在需求改变,公司中添加了新职位,现在需要改变该系统,
结构化设计中,需要改变枚举类型,还要改变if代码,添加一个else if,不仅如此其他涉及到职位的地方都需要修改。【扩展需要改变原来的代码】

而在面向对象设计中,只需要在扩展一个新的类继承自抽象类,改变emFactory.GetEmploypee(id)。【新增不影响原来的代码】

设计原则
1、针对接口的编程,而不是针对实现的编程——>返回接口 依赖倒置
2、优先使用对象组合,而不是类继承(is a)
3、封装变化点【层次松耦合】
在这里插入图片描述
具体原则
1、单一职责原则(SRP)
一个类应该仅有一个引起它变化的原因。
2、开放封闭原则(OCP)
类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭)
3、Liskov替换原则(LSP)
子类必须能够替换它们的基类

任何基类可以出现的地方,子类一定可以出现。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
4、依赖倒置原则(DIP)
高层模块不应该依赖于低层模块,二者都应该依赖于抽象
抽象不应该依赖于实现细节,实现细节应该依赖于抽象
5、接口隔离原则(ISP)
不应该强迫客户程序依赖于它们不用的方法

设计模式的分类:
根据目的分类:
创建型—对象的创建
结构型—处理类与对象的组合【继承关系依赖性过强】
行为型—类与对象交互中的职责分配(组件间行为)——隔离变化
根据范围分类:
类模式处理类与子类静态关系
对象模式处理对象间动态关系

接口与抽象类
接口:多继承【稳定】
抽象类:一次性继承【is a 关系】

猜你喜欢

转载自blog.csdn.net/weixin_51565051/article/details/131269419
今日推荐