单一职责原则(Single Responsibility Principle) SRP
定义:一个类,应当只有一个引起它变化的类。一个类只有一个职责。
优点:
- 降低类的复杂性
- 提高类的可读性
- 提高代码的可维护性和复用性
- 降低因变更引起的风险
应用:
- Java EE的分层框架模式
里氏替换原则 (Liskov Substitution principle)LSP
定义:
- 如果对一个类型为S的对象o1,都有类型为T的对象O2,使得S定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T是类型S的子类型。
- 所有引用基类的地方必须透明的使用其子类对象
- 拿抽象实例对象 学校 hxx = new 大学();
继承规范:
- 子类必须完全实现父类方法
- 子类可以有自己i的个性
- 覆盖或实现父类方法时输入参数可以被放大
- 覆盖或者实现父类方法时输出结果可以被缩小
- 使用基类可以指向子类
应用:
动物 猫 狗
- 策略模式
- 代理模式
- 组合模式
依赖倒置原则(Dependence Inversion Principle)DIP
定义:
- 高层模块不应该依赖低层模块,俩者都依赖其抽象
- 抽象不依赖细节
- 细节应该依赖于抽象
- 高层-->抽象<--实现(低模块)
在Java中的表现:
- 模块间的依赖通过抽象发生,实现类之间不发生之间的依赖关系,其依赖关系是通过接口或抽象类产生的
- 接口或抽象类不依赖于实现
- 实现类依赖于接口或抽象类
- 面向接口编程 OOD
应用:
司机 开车
在driver方法中传入了Car接口,实现了IDriver接口与Car接口间的依赖关系,BMW继实现Car,
driver(Car car);接口
driver(Car car);实现
car.run();
IDriver tom = new Driver();
Car car = new BMW();
tom.Driver(Car);
tom开宝马了
规则:
- 每个类尽量都具有接口或抽象类
- 变量的表模类型尽量是接口或抽象类
- 任何类都不应该存从具体类派生
- 尽量不要重写基类的方法
- 结合里氏替换原则使用
- 接口负责定义抽象方法,声明与其他对象的依赖关系
- 抽象类负责公共构造部分的实现
- 实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化
接口隔离原则(Interfance Segregation Principle) ISP
接口:
- 实例接口 Person qyc = new Person(); Person就是qyc的接口 仅仅是逻辑上的抽象
- 类接口 在Java中用interface严格定义的接口
定义:
- 客户端不应该依赖它不需要的接口
- 类间的依赖关系应该建立在最小的接口上
- 一个接口代表一个角色
- 不应该强迫客户依赖于他们不用的方法
应用:
- Portal-->IOrder<--Order
- 用户接口只有查询方法
- Order实现所有的方法(增删改查)
- 实例化的时候用接口实例化,这样用户只能调用查询方法
规则:
- 一个接口只对一个子模块或者业务逻辑进行服务
- 只保留接口中业务逻辑需要的public方法
- 尽量修改污染了的接口,可采用适配器模式进行转化处理
- 接口设计应该因项目、环境而异,不应该照搬
迪米特法则(Law of Demeter)LoD
最少知道原则LKP
定义:
- 只与你直接的朋友们通信
- 不要跟陌生人通话
- 每个软件单位对其它的单位都只有最少的了解,这些了解仅局限于对那些与本单位密切相关的软件单位
应用:
某人调用朋友的陌生人
- 中介者模式
- 外观模式
面向对象的终极目标
开闭原则(Open—Closed Principle)OCP
定义:一个软件实体应该对扩展开放,对修改关闭
重要性:
- 开闭原则提高复用性 代码的粒度越小,复用性越大
- 提高可维护性
- 提高灵活性
- 易于测试
应用:
书店 书 打折
扩展:
在原有功能基础上,继承类,然后重写方法
创建型模式
是对类实例化过程的抽象化,能够提供对象的创建和管理职责。
- 单例模式:一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,难扩展,不易测试
- 工厂方法模式:创建一个产品对象的工厂接口,将实际创建推迟到子类中
- 抽象工厂模式:工厂方法的升级,为创建一组或相互依赖的对象提供一个接口,而且无需指定他们的具体类
- 建造者模式:也叫生成器模式,组装电脑,将一个复杂对象与其表示分离,使得同样的构造过程可以创建不同表示
- 原型模式:克隆,用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象
结构型模式
将类和对象集合在一起,形成更大的结构。结构型模式的目的是通过组合类或者对象产生更大结构以适应更高层次的逻辑需求。
- 代理模式:为其他对象提供一种代理以控制对该对象的访问
- 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
- 适配器模式:将一个类的接口转换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法一起工作的俩个类能一起工作
- 组合模式:也叫合成模式,将对象组合成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
- 桥梁模式:也叫桥接模式,将抽象与现实解耦,使得俩者可以独立变化
- 外观模式:也叫门面模式,要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,外观模式提供一个高层次的接口,使得子系统更容易被使用
- 享元模式:是池技术的重要实现方式,使用共享对象可以有效地支持大量的细粒度对象
行为型模式
是对不同对象之间划分责任和算法的抽象化。
- 模板方法模式:定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
- 命令模式:是一种高内聚模式,将请求封装成一个对象,从而使用不同的请求把客户端参数化,撤销,恢复功能。
- 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象链接成一条链,并沿着这条链传递请求,直到有对象处理它为止。
- 策略模式:定义一组算法,将每个算法都封装起来,而且使它们之间可以互换。
- 迭代器模式:提供一种方法访问一个容器对象的各个元素,而不需要暴露对象的内部细节。
- 中介者模式:也成为调停模式,用一个中介对象封装一系列对象的交互,中介对象不需要要显示地相互作用,从而使其耦合合松散,而且可以独立地改变它们之间的交互。
- 观察者模式:称为发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
- 备忘录模式:又称为快照模式,或Token模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原来保存的状态
- 访问者模式:封装一些作用于某种数据结构中的各个元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作
- 状态模式:又称为状态对象模式,当一个对象内在状态改变时允许改变行为,这个对象看起来像是改变了其类型
- 解释器模式:给定一门语言,定义他的文法表示,并定义一个解释器,该解释器使用表示来解释语言中的句子