设计模式
1. 原则
1. 单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。 解释:
- 如果一个类职责过多,就等于把这些职责耦合在一起;
- 软件设计正在要做的许多内容,就是发现职责并把那些职责分离;
- 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的职责分离;
2. 开放-封闭原则 开放-封闭原则,是说软件实体(类、模块、函数等)应该可以扩展,但是不可修改。 解释:
- 这个原则有两个特征,对于扩展是开放的(Open for extension),对于更改是封闭的(Close for modification)。 面对。
- 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
3. 依赖倒转原则 A. 高层模块不应该依赖低层模块,两个都应该依赖抽象; B. 抽象不应该依赖细节,细节应该依赖抽象。 解释:
- 要针对接口编程,不要对实现编程。
- 依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是过程化设计了。
4. 里氏代换原则 子类型必须能够替换掉它们的父类型。 解释:
- 只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能正在被复用,而子类也能够在父类的基础上增加新的行为。 单一职责原则:高内聚,一个类只做它该做的事情;
5. 接口隔离原则: 接口小而专,避免大而全;
6. 迪米特法则:高内聚,低耦合;
2. 设计模式
1.创建型模式
- 抽象工厂模式:提供了一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类
- 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
- 工厂方法模式:将类的实例化操作延迟到子类完成,即由子类来决定究竟应该实例化哪一个类
- 单例模式:确保在系统中某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
2.结构型模式
- 适配器模式:将一个接口转换成客户希望的另一个接口,从而使接口不兼容的哪些类可以一起工作
- 桥接模式:将抽象部分与他的实现部分分离,使他们都可以独立的进行变化
- 装饰模式:动态给一个对象增加一些额外的职责
- 代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
3.行为型模式
- 职责链模式:避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止
- 迭代器模式:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示
- 策略模式:定义一系列算法,并将每一个算法封装在一个类中,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化
- 模板方法:定义一个操作中算法的骨架,而将这一些步骤延迟到子类中
3.单例模式
需要: (1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。 (2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。 (3)定义一个静态方法返回这个唯一对象。
实现一:立即加载 / “饿汉模式” “饿汉模式”的优缺点: 优点:实现起来简单,没有多线程同步问题。 缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
实现二:延迟加载 / “懒汉模式” “懒汉模式”的优缺点: 优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存。 缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
代码语言:javascript复制package singletion;
/**
* @author WangXiaoeZhe
* @Date: Created in 2019/9/2 11:46
* @description:
*/
public class Singleton {
/**
* 饿汉式
*/
private static Singleton instance = new Singleton();
/* private Singleton(){}
static Singleton getInstance() {
return instance;
}*/
/**
* 懒汉式
*/
private static Singleton instence = null;
private Singleton() {
}
static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4.JDK中的设计模式
- 单例模式:RuntimeException
- 静态工厂:Integer a = Integer.valueOf(int or String)
- 迭代器模式:Collection.iterator()
- 适配器模式:InputStreamReader和outputStreamWriter
- 装饰器模式:Reader 和 bufferdReader
- 代理模式: SpringAOP
- 工厂模式:SpringIoc
适配器模式:将一个接口适配到另一个接口,Java I/O中InputStreamReader将Reader类适配到InputStream,从而实现了字节流到字符流的准换。 装饰者模式:保持原来的接口,增强原来有的功能。 FileInputStream 实现了InputStream的所有接口,BufferedInputStreams继承自FileInputStream是具体的装饰器实现者,将InputStream读取的内容保存在内存中,而提高读取的性能。