软件开发要实现可维护、可扩展,尽量复用代码,并且降低代码的耦合度,基于OOP编程提炼的
设计原则
1.开放封闭原则(Open-Closed Principle):对扩展开放,对修改关闭
2.单一职责原则(Single Responsibility Principle ):一个类一个功能
3.里氏代换原则(Liskov Substitution Principle):把父类替换成它的子类,程序的行为没有变化->单向
4.依赖倒转原则(Dependence Inversion Principle):依赖抽象
5.接口隔离原则(Interface Segregation Principle):使用多个专门的接口来取代一个统一的接口
6.合成复用原则(Composite Reuse Principle, CRP):尽量多使用组合和聚合关联关系,少使用甚至不使用继承关系
7.迪米特法则(Law of Demeter ):又叫做最少知识原则,没联系不接触,中介
GoF提出23种设计模式:
一.创建型(5种)
- 工厂方法:Factory Method
- 抽象工厂:Abstract Factory
- 建造者:Builder 又名-生成器模式
- 原型:Prototype
- 单例:Singleton
二.结构型(7种)
- 适配器:Adapter
- 代理:Proxy
- 装饰器:Decorator 又称包装模式
- 桥接:Bridge
- 组合:Composite
- 外观:Facade
- 享元:Flyweight
三.行为型(11种)
- 模板方法:Template Method
- 观察者:Publish-Subscribe(Pub/Sub) 又称发布-订阅模式
- 策略:Strategy
- 解释器:Interpreter
- 中介:Mediator
- 责任链:Chain of Responsibility(CoR) 又称职责连锁模式
- 迭代器:Iterator
- 备忘录:Memento
- 状态:State
- 命令:Command
- 访问者:Visitor
MyBatis 源码中用到的几个主要设计模式:
结合学习,不了解 iBatis 的,可跳过
-
工厂模式:SqlSessionFactory-是一个接口类,其子类 DefaultSqlSessionFactorys 有一个 openSession(ExecutorType execType) 方法-使用了工厂模式
-
建造者模式:SqlSessionFactoryBuilder-通过 XMLConfigBuilder 对象读取并解析 XML的配置文件,然后再将读取到的配置信息存入到 Configuration 类中,然后再通过 build 方法生成我们需要的DefaultSqlSessionFactory 对象
-
单例模式:ErrorContext-线程级别的的单例,每个线程中有一个此对象的单例,用于记录该线程的执行环境的错误信息
-
适配器模式:MyBatis 中的日志模块适配了以下多种日志类型:
SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 首先 MyBatis 定义了一个 Log 的接口,用于统一和规范接口的行为
-
代理模式:MapperProxyFactory-的 newInstance() 方法就是生成一个具体的代理来实现功能的
-
模板方法模式:BaseExecutor-在 MyBatis 中 BaseExecutor 实现了大部分 SQL
执行的逻辑,然后再把几个方法交给子类来实现 -
装饰器模式:Cache-除了有数据存储和缓存的基本功能外(由 PerpetualCache 永久缓存实现),还有其他附加的 Cache类,比如先进先出的 FifoCache、最近最少使用的 LruCache、防止多线程并发访问的 SynchronizedCache等众多附加功能的缓存类
补充-
简单工厂模式(静态工厂方法模式):
核心:定义一个具体类负责创建其他类的实例
创建型(5种):
-
工厂方法模式(多态工厂模式):
核心:一个抽象工厂类 工厂方法模式退化后可以演变成简单工厂模式 目的是使得创建对象和使用对象是分离的
-
抽象工厂模式:
核心:创建一系列相关或互相依赖对象的接口
-
建造者模式(builder):/生成器模式
核心:动态地创建具有复合属性的对象
-
原型模式(Prototype):
根据一个现有对象实例复制出一个新的实例,复制出的类型和属性与原实例相同 核心:实现Cloneable接口->浅度克隆与深度克隆
-
单例模式:[重点]
核心:保证一个类仅有一个实例,并提供一个访问它的全局访问点 采用static来共享对象实例 只有private构造方法,确保外部无法实例化/new 饿汉式/懒汉式/双重检测 Java 5 -> 最完美方法:采用枚举enum
//饿汉式
public class Singleton {
// 静态字段引用唯一实例:
private static final Singleton INSTANCE = new Singleton();
// 通过静态方法返回实例:
public static Singleton getInstance() {
return INSTANCE;
}
// private构造方法保证外部无法实例化:
private Singleton() {}
}
//懒汉式
public class Singleton {
// 静态字段引用唯一实例:
private static final Singleton INSTANCE;
// 通过静态方法返回实例:
public static Singleton getInstance() {
if(INSTANCE == null){
synchronized(Singleton.class){
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
// private构造方法保证外部无法实例化:
private Singleton() {}
}
//双重检测
public class Singleton {
// 静态字段引用唯一实例:
private static final Singleton INSTANCE;
// 通过静态方法返回实例:
public static Singleton getInstance() {
if(INSTANCE == null){
INSTANCE = new Singleton();
}
return INSTANCE;
}
// private构造方法保证外部无法实例化:
private Singleton() {}
}
public enum World {
// 唯一枚举:
INSTANCE;
private String name = "world";
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
结构型(7种) :
-
适配器模式(Adapter): 也称Wrapper,继承/委让
核心:改变已有类(或外部类)的接口形式
-
代理模式(Proxy):
核心:普通代理->xxx 动态代理->实现InvocationHandler接口
-
装饰器模式(Decorator,又称包装模式):
核心:扩展->继承的替代 在运行期动态给某个对象的实例增加功能的方法,相比生成子类更为灵活
-
桥接模式(bridge):
核心:类的最小设计原则 将抽象部分与它的实现部分分离,使它们都可以独立地变化
-
组合模式(Composite):
核心:递归构造树形的对象结构,并可通过一个对象来访问整个对象树
-
外观模式(Facade):
核心:类库/子系统等->一个一致的简单的界面->facade
-
享元模式(Flyweight):
核心:共享数据减少内存 运用共享技术有效地支持大量细粒度的对象
行为型(11种):
-
模板方法模式(Template Method):[重点]
核心把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为
-
观察者模式:又称发布-订阅模式(Publish-Subscribe:Pub/Sub): [重点]
核心:继承Observable->底层是个容器->博文 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
-
策略模式(Strategy):C&C接口(Comaparable & Comparator)
核心:处理算法的切换
-
解释器模式(Interpreter):
核心:用来解释预先定义的文法/一种简单的语法解释器构架
-
中介者模式(Mediator):
核心:类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用
-
职责链模式(Chain of Responsibility(CoR),又称职责连锁模式):
核心:该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务
-
迭代模式(Iterator):
核心:把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问
-
备忘录模式(Memento):
核心:保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
-
状态模式(State):
核心:通过改变对象的内部状态而改变对象的行为
-
命令模式(Command):
核心:Command的类封装了对目标对象的调用行为以及调用参数 命令模式的设计思想是把命令的创建和执行分离,使得调用者无需关心具体的执行过程。 通过封装Command对象,命令模式可以保存已执行的命令,从而支持撤销、重做等操作
-
访问者模式(Visitor):
核心:分离对象的数据和行为,可以不修改已有类的情况下,增加新的操作。