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

适配器模式

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

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

实现

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. 你想创建一个可以通用的类,该类可以调用一些不相关的类的接口来供你使用。

桥接模式

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

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

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

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. 抽象和实现部分都可以独立的扩展,而不相互影响。

(0)

相关推荐

  • Java适配器模式定义与用法示例

    本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

  • 实例解析Java设计模式编程中的适配器模式使用

    平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法.有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的.这个时候Adapter模式就会派上用场了. Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种.Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式. 适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器 以下

  • Java设计模式之适配器模式简介

    本文举例说明两种适配器模式,即类适配模式和对象适配模式,详情如下: 1.类适配模式: 举个例子来说明:在地球时代,所有坐骑都是只能跑,不能飞的,而现在很多坐骑在地球都可以飞了.假设,地球时代的坐骑只能跑,而现在的坐骑不仅能飞还能跑,我们可以用类适配模式来实现. 这里需要注意的是,适配器继承源类,实现目标接口. 示例代码如下: package adapter; /** * DOC 源 * */ public class Sources { public void run() { System.ou

  • 轻松掌握Java适配器模式

    在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 特点:将两个不兼容的类通过接口实现在一起工作 企业级开发和常用框架中的应用:流接口,例如将字符流转换为字节流输出是用的outputstreamreader 适配器模式分为类适配器和对象适配器: 举例:电脑只有USB接口,但是键盘只有圆口,这时就需要一个适配器,让键盘能输入数据到电脑 类适配器: pac

  • java设计模式笔记之适配器模式

    适配器(Adapter)模式: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 生活中的场景: 1.笔记本电源适配器,可以将220v转化为适合笔记本使用的电压. 2.给笔记本电脑的usb接口插入台式机的ps/2接口的键盘,需要一个usb和ps/2的接口转接器,此时usb和ps/2的接口转接器就充当了适配器的角色. 通用类图: 在上面的通用类图中,Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一

  • java设计模式之适配器模式(Adapter)

    概述 将一个类的接口转换成用户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 两种实现方式 1.类的适配器模式: 2.对象的适配器模式: 类的适配器模式的UML图,如下: 类的适配器模式把适配的类的API转换成为目标类的API. 上图设计的角色有: 目标角色(Target):这就是所期待得到的接口. 源角色(Adapee):现在需要适配的接口. 适配器角色(Adapter):是本模式的核心,适配器把源接口转换成目标接口. 代码示例: inter

  • Java设计模式之适配器模式(Adapter模式)介绍

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用适配器模式 实现Adapter方式,其实"think in Java"的"类再生&quo

  • Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比

    Java 适配器模式 最近学习java 基础知识,学习适配器的时候疑惑很多,上网查下资料,对于 Adapter的资料很多,但是比较下本篇不错,这里记录下,大家需要的可以看下. 适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作.从功能上说,这些接口不兼容的类一般具有相同或相似的功能.通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模

  • 初识Java设计模式适配器模式

    [正文] 我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础. 完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式.但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善.希望奋斗在码农路上的童鞋们莫吐槽→_→ 一.适配

  • java设计模式之适配器模式

    感谢<Android源码设计模式解析与实战> 何红辉 关爱民 著 适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判断出来,从最早的ListView.GridView.到现在最新的RecyclerView都需要使用Adapter,并且在开发中我们遇到的优化问题.出错概率较大的地方也基本都出自Adapter. 适配器是将两个不兼容的火龙融合在一起,将不同的东西通过一种转换使得它们能够协作起来,例如,经常碰到要在两个没有关系的类型之间进行交互,第一个解决方案是修改各自类的

随机推荐