设计模式GOF23

group of four
创建型模式:关注对象的创建过程
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。
结构型模式:从程序结构上实现松耦合,扩大整体的类结构,关注对象和类 的组织。
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
行为型模式:关注系统中对象之间的相互交互。
模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式。

单例模式

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
应用场景常见5种单例模式实现方式:
1饿汉式{线程安全,调用效率高,但是不能延时加载}
2懒汉式{线程安全,调用效率不高,但可以延时加载}
3双重检测锁式
4静态内部类式{线程安全,调用效率高,可以延时加载}
5枚举单例{线程安全,调用效率高,但不能延时加载,天然阻止反射和反序列化}。
反射和反序列化可以破解单例模式,

了解CountDownLatch的使用

工厂模式

实现了创建者和调用者的分离。实例化对象,用工厂方法代替new操作
面向对象设计的基本原则:
OCP:开闭原则
DIP:依赖倒转原则
LoD:迪米特法则

分类:
简单工厂模式(静态工厂模式)
工厂方法模式:实际是建立每个类的工厂类。不修改已有类的前提下,可以通过增加新的工厂类实现扩展。
抽象工厂模式:产品族。是工厂方法模式的升级。可以增加产品族,但不可以增加产品。

建造者模式

本质:分离了对象子组件的单独构造(Builder)和装配(Director),实现了构建和装配的解耦,适用于某个对象的构建过程复杂的时候。不同构建器,相同装配可做出不同的对象。相同构建器,不同装配可以构建出不同对象。

原型模式prototpye

以某个对象为原型,复制出新的对象。

原型模式实现方式:Cloneable接口和object 接口中的clone方法(内存复制操作)。
这两者是两个不同的对象,但值相同。
浅克隆和深克隆。深克隆会在创建的时候在内存中``新创建引用的对象。

	//通过序列化和反序列化实现深复制
	ByteArrayOutputStream bos=new ByteArrayOutputStream();
	ObjectOutputStream oos=new ObjectOutputStream(bos);
	oos.writeObject(s1);
	byte[] bytes=bos.toByteArray();
	
	//反序列化
	ByteArrayInputStream bis=new ByteArrayInputStream(bytes);
	ObjectInputStream ois=new ObjectInputStream(bis);
	Sheep02 s3=(Sheep02) ois.readObject();

	d.setTime(25000000);
	System.out.println(d);
	System.out.println(s1.getBirthday());
适配器adapter模式

将一个类的接口转换成客户希望的接口。它可以解决接口不兼容的问题。
模式中 的角色:
目标接口(Target):目标可以是具体或抽象的类或接口
需要适配的类(Adaptee)
适配器(Adapter):通过包装一个需要适配的对象,把源接口转换成目标接口。

实现方式:类适配器和(对象适配器方式,使用了组合的方式跟被适配对象整合)

代理模式 Proxy pattern

核心作用:通过代理,控制对对象的访问。AOP(Aspect Oriented Programming)面向切面编程的核心实现机制。
AOP----可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的一种技术。其实就是共有功能的实现
核心角色:
抽象角色–定义代理角色和真实角色的公共对外方法
真实角色–实现抽象角色,定义真实角色实现的业务逻辑,供代理角色调用,
代理角色—实现抽象角色,是真实角色的代理,通过真实角色来实现业务逻辑,也可以增加自己的操作。
将统一的流程放在代理角色中完成。

应用场景:
安全代理–屏蔽对真实角色的直接访问。
远程代理–通过代理类处理远程方法调用
延迟加载–先加载轻量级的代理对象,真正需要时再加载真实对象。

分类:
静态代理;静态定义代理类
动态代理:动态生成代理类(jdk自带的动态代理。handle的invoke方法)

桥接模式bridge

多层继承结构。在多种变化的维度时考虑桥接模式。

组合模式comosite

组合与组合模式是不同的。当把部分和整体的关系用树形结构表示时,考虑用组合模式来使客户端用统一的方式处理部分对象和整体对象。

装饰器模式decorator

包装器模式Wrapper
职责:动态的为一个对象增加新 功能。装饰模式是一个用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
实现细节:
Component抽象构件角色–
ConcreteComponent具体构件角色(真实对象)
Decorator装饰角色—
ConcreteDecorator具体装饰角色–

外观模式facade

迪米特原则(最少知识原则)
核心:为子系统提供统一的入口。便客户端使用。

享元模式FlyWeight

如果存在很多相同或者相似的对象,可以考虑通过享元模式来节省内存。
核心:支持大量高细粒度对象的重用。
关键是区分内部状态和外部状态
内部状态;支持共享,不会随环境不会而变化。
外部状态:不支持共享,会随着环境变化而变化。

实现细节:
FlyweightFactory享元工厂类–>创建并管理享 元对象,享元池一般设计成键值对。
FlyWeight抽象享元类–>
ConcreteFlyWeight具体享元类–>
UnsharedConcreteFlyWeight非共享具体享元类–>

责任链模式chain of responsibility

职责模式:将能够处理同一类请求的对象连成一条链,提交的请求沿着链,链上的对象先判断是否有能力处理,能则处理,否则传递给链上的下一个对象。

迭代器模式 Iterator

提供遍历聚合对象的方式。也叫游标cursor模式
结构:聚合对象(存储数据)和迭代器(遍历数据)

中介者模式Mediator

核心:如果一个系统中对象的联系呈现网状结构,即对象之间存在大量多对多关系,则这些对象称为“同事对象‘。我们可以引入一个中介者对象,将关系简化。

命令者模式command

动作模式Action;事务模式transaction
介绍:将一个请求封装为一个对象。从而可用不同的请求对客户进行参数化,
Command抽象命令类–
ConcreteCommand具体命令类–
Invoker调用者/请求者–
Receiver接收者–实际执行操作内容的对象
Client客户类–

解释器模式(Interpreter

是一种不常用的设计模式
-用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。
-当我们需要开发一种新的语言时,可以考虑使用解释器模式。
开发中常见的场景:
-EL表达式式的处理
-正则表达式解释器。
-SQL语法的计数器。
-数学表达式解析器
。如现成的工具包:Math Expression String Parser ,Expression4J等。

访问者模式(Visitor)访问者模式
策略模式(strategy)

分离算法,选择实现,一个算法对应一个类。然后再由Context负责和具体的策略类交互。这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
开发中常见场景:
JAVASE中的GUI编程,布局管理
Spring框架中,资源访问策咯等等。

模板方法模式(template method)

核心:父类定义好实现步骤,具体的实现方法延迟到子类中定义。
方法回调。

状态模式(State)

不同状态对应不同的行为时。
核心:用于解决系统中复杂对象状态转换以及不同状态下行为的封装问题。
结构:
-Context环境类:.环境类中维护一个当前State对象,他是定义来了当前的状态。
-State抽象状态类
-ConcreteState具体状态类: .每一个类封装了一个状态对应的行为。

观察者模式(Observer)

类似广播机制
观察者–多个订阅者,客户
目标–需要同步给多个客户的数据封装到对象中。

应用场景

备忘录模式(memento)

保存某个对象内部状态的拷贝。方便恢复到原先的状态。
-源发器类Originator:对象的内部状态
-备忘录类Memento:存储内部状态
-负责人类CareTake:存储多个备忘录
备忘点较多时:
-将备忘录压栈
-将多个备忘录对象,序列化和持久化。

猜你喜欢

转载自blog.csdn.net/qq_35383654/article/details/86497466