Java结构型设计模式中的适配器模式与桥接模式解析

 更新时间:2016年02月03日 08:50:03   作者:lixiang0522  
这篇文章主要介绍了Java结构型设计模式中的适配器模式与桥接模式,结构型设计模式是从程序的结构上解决模块之间的耦合问题,需要的朋友可以参考下

适配器模式

定义
适配器模式(英语:adapter pattern)有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起。

有两类适配器模式:
1. 对象适配器模式 - 对象适配器通过关联满足用户期待接口,还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。
2. 类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承),java中没有多重继承,所以这里不做介绍。

实现

20162384930660.png (475×274)

1. Target - 定义Client需要使用的方法。
2. Adapter - 继承或者实现Target,适配Adaptee的方法到Target。
3. Adaptee - 定义一个已经存在的方法。
4. Client - 调用Target中的方法。

public class Adaptee { 
  public void specificRequest(){ 
    System.out.println("Hello, I am from Adaptee!"); 
  } 
} 
 
public interface Target { 
  public void request(); 
} 
 
public class Adapter implements Target { 
  Adaptee adaptee; 
  public Adapter(){ 
    adaptee = new Adaptee(); 
  } 
  public void request(){ 
    adaptee.specificRequest(); 
  } 
} 
 
public class Client { 
  public static void main(String[] args) { 
    Target target = new Adapter(); 
    target.request(); 
  } 
} 

要实现类适配器模式,我们需要Adapter继承Adaptee。

适用场景
1. 你想使用一个旧类,而它的接口不符合你的需求,那么可以使用Adapter类来作为中介类。
2. 你想创建一个可以通用的类,该类可以调用一些不相关的类的接口来供你使用。


桥接模式

动机
有些时候一个抽象应该有不同的实现,比如,保存数据时有两种方式,一种是文件方式,一种是数据库方式,通常的做法是继承保存数据的类,然后实现不同的保存方式。这样做的问题就是难于修改和扩展保存方式,运行时无法切换保存方式。

定义
桥接模式是软件设计模式中最复杂的模式之一,它将事物的抽象部分与它的实现部分分离,使它们都可以独立地变化。

如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。

20162384958680.png (629×299)

1. Abstraction - 定义抽象方法。
2. AbstractionImpl - 使用实现接口来实现抽象方法。
3. Implementor - 为具体实现行为定义接口。
4. ConcreteImplementor1, ConcreteImplementor2 - 实现Implementor接口。

/** "Implementor" */ 
interface DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius); 
} 
  
/** "ConcreteImplementor" 1/2 */ 
class DrawingAPI1 implements DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius)  
  { 
    System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); 
  } 
} 
  
/** "ConcreteImplementor" 2/2 */ 
class DrawingAPI2 implements DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius)  
  {  
    System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); 
  } 
} 
  
/** "Abstraction" */ 
interface Shape 
{ 
  public void draw();                      // low-level 
  public void resizeByPercentage(double pct);   // high-level 
} 
  
/** "Refined Abstraction" */ 
class CircleShape implements Shape 
{ 
  private double x, y, radius; 
  private DrawingAPI drawingAPI; 
  public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) 
  { 
    this.x = x; this.y = y; this.radius = radius;  
    this.drawingAPI = drawingAPI; 
  } 
  
  // low-level i.e. Implementation specific 
  public void draw() 
  { 
    drawingAPI.drawCircle(x, y, radius); 
  }   
  // high-level i.e. Abstraction specific 
  public void resizeByPercentage(double pct) 
  { 
    radius *= pct; 
  } 
} 
  
/** "Client" */ 
class BridgePattern { 
  public static void main(String[] args) 
  { 
    Shape[] shapes = new Shape[2]; 
    shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); 
    shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); 
  
    for (Shape shape : shapes) 
    { 
      shape.resizeByPercentage(2.5); 
      shape.draw(); 
    } 
  } 
} 

实例
1. 动机里面提到的数据保存。
2. 图形的绘制框架。类似上面代码中的实现。

适用场景
1. 你不希望抽象和实现有固定的关系,希望可以在运行时修改实现的方式。
2. 抽象和实现部分都可以独立的扩展,而不相互影响。

相关文章

  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信实例详解

    这篇文章主要介绍了Java多线程中线程间的通信实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Spring+MyBatis多数据源配置实现示例

    Spring+MyBatis多数据源配置实现示例

    本篇文章主要介绍了Spring+MyBatis多数据源配置实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java Map集合使用方法全面梳理

    Java Map集合使用方法全面梳理

    Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value)。一个键(key)和它对应的值构成map集合中的一个元素
    2022-04-04
  • Java HttpClient-Restful工具各种请求高度封装提炼及总结

    Java HttpClient-Restful工具各种请求高度封装提炼及总结

    这篇文章主要介绍了Java HttpClient-Restful工具各种请求高度封装提炼及总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 浅析JVM的垃圾回收器

    浅析JVM的垃圾回收器

    这篇文章主要介绍了JVM垃圾回收器的相关资料,帮助大家更好的理解和学习Java虚拟机的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • 详解MyBatis中Executor执行SQL语句的过程

    详解MyBatis中Executor执行SQL语句的过程

    MyBatis中获取SqlSession时会创建执行器Executor并存放在SqlSession中,本篇文章将以MapperMethod的execute() 方法作为起点,对MyBatis中的一次实际执行请求进行说明,并结合源码对执行器Executor的原理进行阐释
    2023-07-07
  • 深入浅析SPI机制在JDK与Spring Boot中的应用

    深入浅析SPI机制在JDK与Spring Boot中的应用

    SPI是一种使软件框架或库更加模块化、可扩展和可维护的有效方法。通过遵循“开闭原则”, SPI 确保了系统的稳定性和灵活性,从而满足了不断变化的业务需求,这篇文章主要介绍了SPI机制在JDK与Spring Boot中的应用,需要的朋友可以参考下
    2023-09-09
  • Java中的强引用,软引用,弱引用,虚引用的作用介绍

    Java中的强引用,软引用,弱引用,虚引用的作用介绍

    这篇文章主要介绍了Java中的强引用,软引用,弱引用,虚引用的作用,下文内容具有一定的知识参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • Spring Boot集成etcd的详细过程

    Spring Boot集成etcd的详细过程

    etcd是一个分布式键值存储数据库,用于共享配置和服务发现,etcd采用Go语言编写,具有出色的跨平台支持,很小的二进制文件和强大的社区,这篇文章主要介绍了SpringBoot集成etcd,需要的朋友可以参考下
    2023-08-08
  • 详谈java线程与线程、进程与进程间通信

    详谈java线程与线程、进程与进程间通信

    下面小编就为大家带来一篇详谈java线程与线程、进程与进程间通信。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04

最新评论