前言
软件开发中疑难问题:
- 软件复杂庞大
- 很多软件进入维护阶段
- 需求的不断变更
软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题。需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性、可维护性和可扩展性。我们需要保证代码具有高内聚低耦合。
什么是对象?
对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。比如,一个球,一张桌子,一辆汽车都是对象。
对象就是具有可描述特征的事物,我们可以用某种特定的方式去影响和操作它。
在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。
方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。
面向对象编程
四大基本特性
抽象:提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:属性(数据)和操作(动作)。这个抽象模型我们称之为类。对类进行实例化得到对象。
封装:将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。封装可以使类具有独立性和隔离性;保证类的高内聚。只暴露给类外部或者子类必须的属性和操作。类封装的实现依赖类的修饰符(public、protected和private等)
面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。
继承:对现有类的一种复用机制。简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。这里指的继承包含:类的继承和接口的实现。
多态:多态是指不同事物具有不同表现形式的能力。多态是在继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类对象。父类引用指向不同的子类对象时,调用相同的方法,呈现出不同的行为;就是类多态特性。多态可以分成编译时多态和运行时多态。
多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。
封装可以隐藏实现细节,使得代码模块化;
继承可以扩展已存在的代码模块(类);为了实现代码重用。
多态则是为了实现接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
抽象、封装、继承和多态是面向对象的基础。在面向对象四大基础特性之上,我们在做面向对象编程设计时还需要遵循有一些基本的设计原则。
七大设计原则
开闭原则
一个软件实体,如类,模块和函数应该多外扩展开发,对内修改关闭
即不修改原有代码的前提下给程序扩展功能,增加了程序的可扩展性。
单一职责原则
一个类只允许有一个职责,即只有一个导致该类变更的原因
依赖倒置原则
依赖抽象而不是依赖实现,高层模块不能依赖底层模块
即针对接口编程,而不是针对实现编程,通过抽象搭建框架,建立类与类的关联,以减少类间的耦合性。
接口分离原则
多个特定的客户端接口要好于一个通用性的总接口;
避免用一个接口里面包含不同职责的方法,接口责任划分更加明确
迪米特法则
一个对象应该对尽可能少的对象有接触,只接触那些真正需要接触的对象
里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象,而程序执行效果不变。可以检测继承使用的正确性。
合成复用原则
尽量使用合成/聚合的方式,而不是使用继承。
总结为:
- 开闭原则:是总纲,告诉我们要对扩展开放,对修改关闭;
- 单一职责原则:告诉我们实现类/方法要职责单一;
- 依赖倒置原则:告诉我们不要破坏继承体系;
- 接口隔离原则:告诉我们在设计接口的时候要精简单一;
- 迪米特法则:告诉我们要降低耦合度;
- 里氏替换原则:告诉我们不要破坏继承体系;
- 合成复用原则:告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。
在遵循这些面向对象设计原则基础上,前辈们总结出一些解决不同问题场景的设计模式,以四人帮的gof23最为知名。
24种设计模式(gof23+1)
创建型模式:
- 简单工厂模式(不包含在gof23中)
- 工厂模式
- 抽象工厂模式
- 单例模式
- 原型模式
- 创建者模式
结构型模式:
- 组合模式
- 装饰者模式
- 外观模式
- 适配器模式
- 代理模式
- 享元模式
- 桥接模式
行为型模式:
- 观察者模式
- 策略模式
- 状态模式
- 中介模式
- 模板方法
- 命令模式
- 备忘录模式
- 访问者模式
- 解释器模式
- 迭代器模式
- 职责链模式
怎么理解面向对象的JavaScript?
详情查看:全面理解面向对象的JavaScript