4.结构型模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/87965565
  1. 结构型模式
    1. 适配器模式Adapter
  1. 作用: 将一个接口转化为客户端希望的另一个接口
  2. 案例: 110v-220v,LINUX上运行WINDOWS系统(适配器)
  3. 注意事项: 适配器过多时系统维护困难。
  4. JDK中使用: IO体系中InputStreamReader读入的文件要实现逐行读入功能

 BufferedReader br = new BufferedReader(new InputStreamReader(is2,"utf8"));br.readLine();

  1. UML案例

 

    1. 装饰模式Decorator
  1. 作用: 在不改变接口的基础上,给现有类增加额外的功能。
  2. 使用方式: 装饰类和被装饰类实现同一接口,在装饰类中持有被装饰类的引用。在装饰类的方法中,调用了被装饰类的方法,并添加了新的功能。
  3. 优点:可以相互独立,避免使用继承的方式,减少耦合
  4. JDK中使用: BufferedInputStream,BufferedOutputStream
  5. UML案例

 

 

    1. 桥接模式Bridge
  1. 作用: 将抽象部分和实现部分想分离,使二者可以独立变化。
  2. 使用场景:如画笔的颜色粗细,其抽象和实现部分是相互独立的场景
  3. JDK中使用: AWT,JDBC
  4. UML案例: 跨平台图像浏览系统,要求能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、Unix等多个操作系统上运行。

画笔有1、2、3寸的,红色、黑色、蓝色的。当增加4寸的画笔时,如果按照多层继承模式,需要添加3个类。如下图,使用桥接模式,只需要增加1个FourPenServic类即可。

 

 

    1. 代理模式Proxy
  1. 作用: 通过代理对象去访问目标对象,从而实现了在不改变目标对象功能的基础上,扩展额外的功能。
  2. 使用场景: 如创建开销很大,需要安全控制,需要进程外的访问的情况。如windows的快捷方式,代售点可以代理火车站购票的业务,银行存单是银行中资金的代理。
  3. JDK中使用: Proxy
      1. 代理模式的区别

静态代理(普通代理):代理对象和目标对象同实现一个接口,在代理对象中调用了目标对象的方法。使客户端对目标对象的调用,只能通过代理对象来实现。冗余,扩展时不易维护。

动态代理:在目标对象实现接口的前提下,利用JDK的反射机制,在运行时动态的生成代理对象并加载到JVM中,即编译完成后不存在class文件。

CGLIB代理:使用第三方类库动态的生成代理对象,不需要目标对象实现接口,可以防止代理类的侵入。

      1. 静态代理:

 

      1. 动态代理
        1. 特点

即利用API反射的思想,动态的在内存中构建代理对象;且目标对象必须实现接口。

        1. 代理对象需实现InvocationHandler接口

作用:即通过目标对象,获取一个代理对象的调用处理对象handler。随后使用该调用处理对象handler,来构造一个代理对象Proxy proxy。

方法:invoke(Object proxy, Method method, Object[] args) :执行代理对象proxy的方法method

 

        1. Proxy:newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序

classLoader loader,  //目标对象使用类加载器

Class<?>[] interfaces,//目标对象实现的接口的类型

InvocationHandler h  //事件处理器

        1. 示例

 

      1. CGLIB代理
        1. 特点

第三方类库,用于扩展JDK动态代理中只能代理实现接口的类对象的功能。即目标对象无需实现接口,可以防止代理类的侵入。

        1. 应用:spring-aopspring-core下含有CGLIB的包
        2. 示例

 

 

    1. 过滤器模式Criteria
  1. 作用: 允许使用多重的标准来过滤一组对象,并将其运算结果以AND/OR的方式合并起来。
  2. 使用场景: 将单个标准分别建立类文件,符合条件的数据进行返回。
  3. UML案例: 一堆水果中有橘子,苹果,香蕉;有圆的,长的;酸的,甜的。假定要帅选出橘子,橘子或者苹果,香蕉或者圆的。

 

    1. 组合模式Composite-树状对象
  1. 作用: 把一组相似的对象表示为一个整体,常表现为树状结构
  2. 使用场景: 文件目录表示,数据运算中的表达式,二叉树的概念
  3. 优点: 高层模块的调用简单,且节点的增加简单
  4. UML案例

 

    1. 外观模式
  1. 作用: 为系统定义一个高层接口,供客户端访问
  2. 使用场景: java的三层开发模式;去医院挂号-门诊-划价-取药很复杂,如果交由接待人员则很简单;电脑启动时按下电源即可,内部隐藏了启动CPU,内存,硬盘等操作。即相当于提供一个高层类,类中封装了启动CPU内存硬盘的操作。
  3. 优点:降低系统的耦合,提高系统的安全 

 

    1. 享元模式
  1. 作用: 创建对象时,尝试查找同类对象,如果有匹配则返回;没有匹配则创建。
  2. 优点: 减少对象的创建数量,以减少内存的占用
  3. JDK中使用: JDK 中 String 池、Integer 池以及 Long 池

 

    1. 对比
      1. 适配器模式

将一个类的接口,转换成客户期望的另一个接口。

如110v的电器使用220v的电源,修改了接口的功能。

适配器接口AdapterInterface中,持有了目标接口TargetInterface的引用t。在调用适配器接口的方法adapterMethod()时,实质上调用的是t.targetMethod()。

      1. 装饰器模式

在不改变原有接口的基础上,动态的给一个对象增加一些新的功能

装饰者类DecoratorClass和目标类TargetClass,实现的是同一个接口Interface(method),且装饰者类持有了目标类的引用t。在执行装饰者类的method()时,在调用t.method()之外,还调用了装饰者类的方法。

      1. 代理模式

目标对象由于各种原因不能直接访问,通过代理对象实现对目标对象的访问控制。从而避免了对目标对象的修改,并增加了功能。如spring aop的思想,即增加一个中间层,以便于访问、控制。

      1. 桥接模式

如果需要处理的问题,具有两个维度。如画笔,有尺寸、颜色,两个各不关联的维度。在新增加一种画笔的情况下,如果使用多层继承的方法,需要添加多个类,且扩展性差,两个维度之间的耦合高。故使用桥接模式,将其分为抽象(尺寸)以及实现(颜色)两个维度,在抽象中持有实现部分的引用。从而在新增加一种尺寸的画笔时,只需要增加一个类,且维度之间的实现了相互解耦。

 

设计模式大纲 https://blog.csdn.net/qq_38331606/article/details/87965558

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/87965565