面向对象的六大原则
基础 接口和抽象类区别
抽象类是可以表示一种东西的根源,是可以有成员属性和动作的。而接口则仅仅表示动作。
单一职责原则 SRP
每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。
——维基百科
就是一个类尽量就只有一个单一功能。
——我的理解
开闭原则 OCP
“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的,”这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。
——维基百科
一个程序开发完成,实现可以修改,但新增功能接口应该通过一个新的类实现。
——我的理解
里氏替换原则 LSP
派生类(子类)对象能够替换其基类(超类)对象被使用。
——维基百科
抽象。
——我的理解
依赖倒置原则 DIP
指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象
——维基百科
方法尽量依赖于抽象,把具体实现留给抽象方法实现。
——我的理解
接口隔离原则 ISP(灵活性)
指明客户(client)应该不依赖于它不使用的方法
——维基百科
设计接口尽量细化,不要让类实现无用的抽象方法。
——我的理解
迪米特原则/最少知识原则 LOD
每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元;
每个单元只能和它的朋友交谈:不能和陌生单元交谈;
只和自己直接的朋友交谈。
——维基百科
尽量降低类与类之间的耦合。
——我的理解
设计模式
Builder(建造者) 模式
适用于相同方法不同执行顺序产生不同结果,或者是初始化对象参数多的时候。
代码
效果
Prototype(原型)模式
主要就是拷贝对象,适用于初始化对象消耗资源严重的时候,注意拷贝的对象的构造方法不会执行,且注意除了基本数据类型外是按值传递其它都是按引用传递,要注意浅克隆不会克隆引用。深克隆也可以采用对象序列化的方式。
效果
Factory(工厂)模式
用于创建对象使用,需要生成复杂的对象的时候用。
效果
Abstract Factory(抽象工厂)模式
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。就是更抽象化的工厂模式。
Strategy(策略)模式
适用于 一种类型的多种操作方法的时候或者一个抽象类有多个子类而又需要用if else 或者 switch case来选择具体子类的时候。用来封装算法。
例子是计算不同轮胎在不同公里消耗情况
效果
|
|
State(状态)模式
适用于一个对象的行为取决于它的状态·,且需要在运行时改变状态。
这里例子用汽车关闭电源 打开电源 和启动发动机的状态
效果
Iterator(责任链)模式
适合于多个对象可以处理同一个请求,但具体有哪个处理则在运行时动态决定。
例子为请假审批流程
效果
Template(模板)模式
适用于多个子类公有的方法,且逻辑基本相同时候,不改变结构通过重写部分实现内容。
效果
Composite(组合)模式
适用于需要表示对象部分或整体层次的时候
效果
Flyweight(享元)模式
适用于系统存在大量相似对象,可以通过享元模式进行缓存
效果
Adapter(适配器)模式
适合于系统需要当前的类,而当前的类不符合需求需要转换的情况。
效果
Command(命令)模式
适用于将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作。就是把具体执行命令的类包装两层。
效果
Observer(观察者)模式
适用于一对多的依赖状态,使当一个类改变状态时,所有依赖它的其它类会收到通知。
Proxy(代理)模式
适用于不想直接或无法直接访问一个类的时候,可以使用代理对象。
代理模式
Singleton(单例)模式
适用于确保一个类只有一个实例的情况
懒汉式单例模式
静态内部类单例(线程安全且懒加载)
Decorator(装饰)模式
动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
懒汉式单例模式