适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern))是作为两个不兼容的接口之间的桥梁
这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能

介绍

意图:将一个类的接口转换成客户希望的另外一个接口
主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的
何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要 2.通过接口转换,将一个类插入另一个类系中
如何解决:继承或依赖
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口
应用实例: 1.在 LINUX 上运行 WINDOWS 程序
优点: 1.可以让任何两个没有关联的类一起运行 2.提高了类的复用
缺点: 1.过多地使用适配器,会让系统非常零乱,不易整体进行把握

实现

1.定义需要实现额外功能的接口
2.实现额外接口并继承原功能的适配器类
944365-c736416f78a5b2d5.png

桥接模式(Bridge Pattern)

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化
这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响

介绍

意图:将抽象部分与实现部分分离,使它们都可以独立的变化
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活
何时使用:实现系统可能有多个角度分类,每一种角度都可能变化
如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合
关键代码:抽象类依赖实现类
应用实例: 1.墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的
优点:1.抽象和实现的分离 2.优秀的扩展能力
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

实现

1.定义桥接接口
2.实现桥接接口的抽象类
3.继承实现桥街街口的抽象类
76334-f8902b04ad002d4e64ed8d56ae3380a2.jpg

过滤器模式(Filter Pattern)

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来

实现

1.定义过滤器接口
2.实现过滤器接口
3.通过过滤器过滤数据
image.png

组合模式(Composite Pattern)

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构

介绍

意图:将对象组合成树形结构以表示”部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性
主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
何时使用:1.您想表示对象的部分-整体层次结构
如何解决:树枝和叶子实现统一接口,树枝内部组合该接口
关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component
应用实例:1.算术表达式包括操作数、操作符和另一个操作数,其中另一个操作符也可以是操作数、操作符和另一个操作数
优点: 1.高层模块调用简单
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

实现

1.定义实体类并附有上级/下级对象
image.png

装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装

介绍

意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活
主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀
何时使用:在不想增加很多子类的情况下扩展类
如何解决:将具体功能职责划分,同时继承装饰者模式
关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具体扩展类重写父类方法
应用实例:1.孙悟空有 72 变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点:多层装饰比较复杂

实现

1.Component类作为接口
2.ComonentImpl实现Component作为原功能类
3.装饰类Decorator内置Component对象
4.ConcreteDecorator具体修饰类扩展原有方法
image.png

外观模式(Facade Pattern)

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性

介绍

意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口
何时使用: 1.客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可
如何解决:客户端不与系统耦合,外观类与系统耦合
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好
应用实例: 1.JAVA 的三层开发模式
优点: 1.减少系统相互依赖
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适

实现

1.将功能聚合到某个类对象中,提供入口即可
image.png

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能
这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式

介绍

意图:运用共享技术有效地支持大量细粒度的对象
主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建
何时使用:1.系统中有大量对象。 2.这些对象消耗大量内存 3.这些对象的状态大部分可以外部化
如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象
关键代码:用 HashMap 存储这些对象。
应用实例: 1.JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面
优点:大大减少对象的创建,降低系统的内存,使效率提高
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类 Circle,下一步是定义工厂类 ShapeFactory
ShapeFactory 有一个 CircleHashMap,其中键名为 Circle 对象的颜色.无论何时接收到请求,都会创建一个特定颜色的圆.ShapeFactory 检查它的 HashMap 中的 circle 对象,如果找到 Circle 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端
FlyWeightPatternDemo 类使用 ShapeFactory 来获取 Shape 对象.它将向 ShapeFactory 传递信息(red / green / blue/ black / white_,以便获取它所需对象的颜色
结构型模式 - 图7

代理模式(Proxy Pattern)

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口

介绍

意图:为其他对象提供一种代理以控制对这个对象的访问
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层
何时使用:想在访问一个类时做一些控制
如何解决:增加中间层
关键代码:实现与被代理类组合
应用实例:1.spring aop
优点: 1.职责清晰 2.高扩展性
缺点: 1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢 2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂

实现

我们将创建一个 Image 接口和实现了 Image 接口的实体类.ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用.
ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示
结构型模式 - 图8