适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern))是作为两个不兼容的接口之间的桥梁
这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能
介绍
意图:将一个类的接口转换成客户希望的另外一个接口
主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的
何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要 2.通过接口转换,将一个类插入另一个类系中
如何解决:继承或依赖
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口
应用实例: 1.在 LINUX 上运行 WINDOWS 程序
优点: 1.可以让任何两个没有关联的类一起运行 2.提高了类的复用
缺点: 1.过多地使用适配器,会让系统非常零乱,不易整体进行把握
实现
1.定义需要实现额外功能的接口
2.实现额外接口并继承原功能的适配器类
桥接模式(Bridge Pattern)
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化
这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响
介绍
意图:将抽象部分与实现部分分离,使它们都可以独立的变化
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活
何时使用:实现系统可能有多个角度分类,每一种角度都可能变化
如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合
关键代码:抽象类依赖实现类
应用实例: 1.墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的
优点:1.抽象和实现的分离 2.优秀的扩展能力
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
实现
1.定义桥接接口
2.实现桥接接口的抽象类
3.继承实现桥街街口的抽象类
过滤器模式(Filter Pattern)
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来
实现
组合模式(Composite Pattern)
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构
介绍
意图:将对象组合成树形结构以表示”部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性
主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
何时使用:1.您想表示对象的部分-整体层次结构
如何解决:树枝和叶子实现统一接口,树枝内部组合该接口
关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component
应用实例:1.算术表达式包括操作数、操作符和另一个操作数,其中另一个操作符也可以是操作数、操作符和另一个操作数
优点: 1.高层模块调用简单
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
实现
装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装
介绍
意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活
主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀
何时使用:在不想增加很多子类的情况下扩展类
如何解决:将具体功能职责划分,同时继承装饰者模式
关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具体扩展类重写父类方法
应用实例:1.孙悟空有 72 变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点:多层装饰比较复杂
实现
1.Component类作为接口
2.ComonentImpl实现Component作为原功能类
3.装饰类Decorator内置Component对象
4.ConcreteDecorator具体修饰类扩展原有方法
外观模式(Facade Pattern)
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性
介绍
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口
何时使用: 1.客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可
如何解决:客户端不与系统耦合,外观类与系统耦合
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好
应用实例: 1.JAVA 的三层开发模式
优点: 1.减少系统相互依赖
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适
实现
1.将功能聚合到某个类对象中,提供入口即可
享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能
这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式
介绍
意图:运用共享技术有效地支持大量细粒度的对象
主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建
何时使用:1.系统中有大量对象。 2.这些对象消耗大量内存 3.这些对象的状态大部分可以外部化
如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象
关键代码:用 HashMap 存储这些对象。
应用实例: 1.JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面
优点:大大减少对象的创建,降低系统的内存,使效率提高
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
实现
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类 Circle,下一步是定义工厂类 ShapeFactory
ShapeFactory 有一个 Circle 的 HashMap,其中键名为 Circle 对象的颜色.无论何时接收到请求,都会创建一个特定颜色的圆.ShapeFactory 检查它的 HashMap 中的 circle 对象,如果找到 Circle 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端
FlyWeightPatternDemo 类使用 ShapeFactory 来获取 Shape 对象.它将向 ShapeFactory 传递信息(red / green / blue/ black / white_,以便获取它所需对象的颜色
代理模式(Proxy Pattern)
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口
介绍
意图:为其他对象提供一种代理以控制对这个对象的访问
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层
何时使用:想在访问一个类时做一些控制
如何解决:增加中间层
关键代码:实现与被代理类组合
应用实例:1.spring aop
优点: 1.职责清晰 2.高扩展性
缺点: 1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢 2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂
实现
我们将创建一个 Image 接口和实现了 Image 接口的实体类.ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用.
ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示