6大原则
单一职责原则
一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。核心就是控制类的粒度大小、将对象解耦、提高其内聚性
开放封闭原则
软件实体(类、模块、函数等)可以应该可以扩展,但不可以修改
依赖倒转原则
PC中的
易插拔
—— 对象中的强内聚、松耦合
、
- 高层模块不应该依赖于低层模块,两个都应该依赖于抽象。
- 抽象不应该依赖于细节,细节应该依赖于抽象。(针对接口编程,不要对实现编程)
里氏代换原则
子类型必须能替换掉它们父类型。(子类拥有父类所有非private的行为和属性)
迪米特法则
如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。
- 思想:强调了类之间的松耦合。 类之间的耦合越弱,越有利于复用。
设计模式
创建型模式
作用于对象的创建,将对象的创建与使用分离
单列模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点
原型模式
在原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示。
它主要用于创建一些复杂的对象,这些对象内部结构间的建造顺序通常是稳定的,但内部的结构通常面临着复杂的变化。(创建对象的模板)
简单工厂模式
工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖
缺点:违背了开放-封闭原则
, 增加新功能的是的时候需要在工厂类的switch中修改逻辑。
class OperationFactory {
public static Operation createOperation(char operation){
Operation oper = null;
switch (operation) {
case '+': {
oper = new OperationAdd();
}
case '-': {
oper = new OperationSub();
}
case '*': {
oper = new OperationMul();
}
case '/': {
oper = new OperationDiv();
}
}
return oper;
}
}
工厂方法模式
工厂方法模式:定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
遵循了开放-封闭原则
// 工厂类
interface IFactory{
IOperation createOperation();
}
// 工厂实现类
class AddOperationFactory implements IFactory{
public IOperation createOperation() {
return new AddOperation();
}
}
class SubOperationFactory implements IFactory{
public IOperation createOperation() {
return new SubOperation();
}
}
抽象工程模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:
易于交换产品系类,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.
让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
缺点:
新增功能的时候,需要改动所有的工厂和工厂实现类。如需要增加一个ProductC,所有的工厂 类都需要增加crateProductC相关方法。
优化扩展: (抛弃 *Factory 工厂类)
-
用简单工厂来改进抽象工厂
class ProductAccess{ private String type; public ProductAccess(String type){ this.type = type; } public static AbstractProductA crateProductA(){ AbstractProductA productA = null; switch(type){ case:"1" productA = new ProductA1(); break; case:"2" productA = new ProductA2(); break; } return productA; } public static AbstractProductA crateProductB(){ ...... } }
-
反射 + 抽象工厂
额我说的我
结构型模式
将类或对象按某种布局组成更大的结构
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
适配器模式
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容不能一起工作的那些类可以一起工作。
场景: 系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况
两个类所做的事情相同或相似,但是具有不同的接口时要使用他,客户代码可以统一调用同一接口
、
外观模式
为子系统中的一组接口提供 提供一个一致的界面,此模式定义了一个高层接口,这一接口使得子系统更加容易使用。
装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
桥接模式
将抽象部分与他的是实现部分分离,使它们都可以独立的变化(GoF)。
通俗意思: 实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少他们之间的耦合。
- 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数
享元模式
运用共享技术有效的支持大量细粒度的对象。
组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
- When: 需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式了
行为型模式
作用于类或对象之间相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
模板方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
策略模式
它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
- 策略模式就是用来封装算法的,在实践中也可以用来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
- 目的:消除庞大的条件分支语句,状态模式通过各种状态转移逻辑分布在Status之间,来减少相互的依赖。
- 什么时候用:当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了。
观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个歌主题对象在状态发生变化时,会通知所有的观察者对象,使它们能过自动更新自己。
- 什么时候使用:
- 当一个对象的改变需要改变其他对象,而且它不知道具体要有多少对象待改。
- 当一个抽象模型有两个方面,其中一个依赖于另外一个方面,可以用观察者模式将两者封装在独立的对象中,使它们各自独立的改变和复用。
事件委托
委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值,委托可以看作时对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数