结构型模式

核心作用:从程序结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题


适配器模式(adapter)

现实例子:转换器、转接头、变压器等
作用:
将一个类的接口转换成期望接口。使得原本不兼容可以兼容工作
角色:
目标接口(Target):期望接口
适配器(Adapter)转接头
需要适配的类(Adaptee)现有的类/接口
JDK
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)




桥接模式(Bridge)

解决:单一维度继承带来的不易扩展的问题


核心要求:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展。在抽象层建立关联。


可以取代多层继承的方案。多层继承违背了SRP,复用性差,类的个数多不易维护。从而提高了系统的扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合OCP


装饰模式(Decorator/Wrapper)

职责:

动态的为一个对象添加新的功能。是一种代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。


角色:
Component抽象构件角色
真实对象和装饰对象所共有接口。这样对于客户端就能够实现调用替换  
ConcreteComponent具体构件角色(真实对象)
例子:io流中的FileInputStream、FileOutputStream  
Decorator装饰角色
持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象,这样就能在真实调用调用前后增加新的功能。例子:FilterInputStream  
ConcreteDecorator(具体装饰角色)
负责给构件对象增加新的责任例子:BufferedInputStream、DataInputStream  


应用:

Servlet API : ServletRequestWrapper、HttpServletRequestWrapper


缺点:

产出很多小对象。大量小对象占据内存,一定程度上影响性能;易于出错,不易调试排查与桥接模式的区别:相同:都是为了解决过多子类对象问题诱因不同:桥接——对象自身现有机制沿着多个维度变化,是既有部分不稳定装饰——为了增加新的功能


组合模式

场景:

把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象


核心:
抽象构件(Component)角色:定义了叶子和容器构件的共同点
叶子(Leaf):构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点

应用:
JUnit底层设计中:TestCase、TestUnite、Test



外观模式(门面模式 Facade)


为了系统提供统一的接口。封装子系统的复杂性,便于客户端调用



享元模式(Flyweight)

场景:
内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,可以通过享元模式,节省内存
核心:
以共享的方式高效地支持大量细粒度对象的重用
共享的关键是区分了内部状态和外部状态
内部状态:可以共享,不会随环境变化而改变
外部状态:不可以共享,会随环境变化而改变
实现:
FlyWeightFactory享元工厂类
创建并管理享元对象,享元池一般设计成键值对
FlyWeight抽象享元类
声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态
ConcreteFlyWeight具体享元类
为内部状态提供成员变量进行存储
UnsharedConCreteFlyWeight非共享享元类(外部状态封装类)
不能被共享的子类可以设计成非共享享元类
应用:
线程池、数据库连接池、java.lang.String
优缺点:
优点:
极大减少内存中对象的数量
相同或相似的对象内存中只存一份,极大的节约资源,提高系统性能
外部状态相对独立,不影响内部状态
缺点:
模式较为复杂,是程序逻辑复杂化
为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态师运行时间变长。用时间换取空间


代理模式(Proxy)

作用:

通过代理,控制对对象的访问;即可以详细控制某个(某类)对象的方法,在调用方法前后进行逻辑处理


角色:
抽象角色:定义代理角色和真实角色的公开方法
真实角色:实现抽象角色,实现真实业务逻辑
代理角色:实现抽象角色,代理真实角色,并在真实角色的业务处理中加入附加操作
分类:
静态代理
动态代理
JDK自带的动态代理(java.lang.reflect.Proxy,java.lang.reflect.InvocationHandler) java.beans.EventHandler
javaassist字节码操作库实现
CGLIB
ASM(底层使用指令,可维护性差)