`
zhangweieye
  • 浏览: 9972 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(五:适配器模式)

 
阅读更多

1.1概述

    在实际生活中有很多和适配器类似的问题,比如有A型螺母和B型螺母,那么用户可以在A型螺母上直接使用按着A型螺母标准生产的A型螺丝,同样用户可以在B型螺母上直接使用按着B型螺母标准生产的B型螺丝。但是由于A型螺母和B型螺母标准不同,所以用户在A型螺母上不能直接使用B型螺丝,反之亦然。那现在有什么办法可以解决这个问题呢?具体办法如下:

    生产一种“A型螺母适配器”,这种A型螺母适配器的前端符合A型螺母标准要求,可以直接拧在A型螺母上,后端焊接一个B型螺母。现在用于借助A型螺母适配器就可以在A型螺母上使用B型螺丝。

    适配器模式是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中涉及有目标、被适配者和适配器。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。

 

1.2模式的结构

     由于Java不支持多重继承,即一个类只能有一个父类,所以下面介绍的对象适配器的结构具体角色,共包含三种角色:

(1)目标(Target):目标是一个接口,该接口是客户想使用的接口。

(2)被适配者(Adaptee):被适配者是一个已存在的接口或者抽象类,这个接口或者抽象类需要适配。

(3)适配器(Adapter):适配器是一个类,该类实现了目标接口并包含有被适配者的应用,即适配器的职责是对被适配者接口与目标接口进行适配。

    适配器模式结构的类图如下所示:

 

 

1.3适配器模式的优点

(1)目标和被适配者是完全解耦关系。

(2)适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。

 

1.4适合使适配器模式的情景

(1)一个程序想使用已经存在的类,但该类所实现的接口和当前程序所使用的接口不一致。

 

 

1.5适配器模式的使用

以下通过一个简单的问题来描述适配器模式中所涉及的各个角色。

现在用户已有一个两相的插座,但最近用户又有了一个新的三相插座。用户现有一台洗衣机和一台电视机,洗衣机按着三相插座的标准配有三相插头,而电视机按着两相插座的标准配有两相插头,现在用户想用新的三相插座来使用洗衣机和电视机,即用新的三相插座为洗衣机和电视机接通电流。

针对上面问题,使用适配器模式设计若干个类,具体如下:

首先看一下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图3所示:

图3  具体编写类及接口与类图对应关系

(1)目标(Target

本问题中,目标(Target)接口的名字是ThreeElectricOutlet,用来刻画三相插座,该接口定义的方法是:connectElectricCurrent()。该接口代码如下:

package com.liuzhen.five_adapter;

public interface ThreeElectricOutlet {
    public abstract void connectElectricCurrent();
}

 

(2)被适配者(Adaptee

对于本问题,被适配者是一个接口,该接口的名字是TwoElectricOutlet,刻画两相插座,该接口定义的方法是:connectElectricCurrent()。该接口代码如下:

package com.liuzhen.five_adapter;

public interface TwoElectricOutlet {
    public abstract void connectElectricCurrent();
}

 

(3)适配器(Adapter

适配器的名字是ThreeElectricAdapter类,该;类实现了ThreeElectricOutlet接口并包含有TwoElectricOutlet接口变量。该类代码如下:

复制代码
package com.liuzhen.five_adapter;

public class ThreeElectricAdapter implements ThreeElectricOutlet {
    TwoElectricOutlet outlet;          //定义一个二相插座的引用对象
    //构造函数
    ThreeElectricAdapter(TwoElectricOutlet outlet){
        this.outlet = outlet;
    }
    public void connectElectricCurrent() {
        // TODO Auto-generated method stub
        outlet.connectElectricCurrent();  //通过二相插座引用对象调用其具体方法,实现二相插座通电
    }

}
复制代码

 

(4)洗衣机(Wash)类

     洗衣机配有三相插头,故该类要实现三相插座接口ThreeElectricOutlet,其代码如下:

复制代码
package com.liuzhen.five_adapter;

public class Wash implements ThreeElectricOutlet {  //洗衣机使用三相插座
    String name;
    Wash(){
        name = "黄河洗衣机";
    }
    Wash(String name){
        this.name = name;
    }

    public void connectElectricCurrent() {
        // TODO Auto-generated method stub
        turnOn();
    }
    public void turnOn(){
        System.out.println(name+"开始洗衣服。");
    }

}
复制代码

 

(5)电视机(TV)类

电视机配有两相插头,故该类要实现两相插座接口TwoElectricOutlet,其代码如下:

复制代码
package com.liuzhen.five_adapter;

public class TV implements TwoElectricOutlet {   //电视机使用两相插座
    String name;
    TV(){
        name = "长江电视机";
    }
    TV(String name){
        this.name = name;
    }

    public void connectElectricCurrent() {
        // TODO Auto-generated method stub
        turnOn();
    }
    public void turnOn(){
        System.out.println(name+"开始播放节目。");
    }

}
复制代码

 

(6)具体使用

通过FiveApplication类来具体实现上述相关类和接口,来实现适配器模式的运用,其代码如下:

复制代码
package com.liuzhen.five_adapter;

public class FiveApplication {
    public static void main(String args[]){
        ThreeElectricOutlet outlet;      //目标接口(三相插座)
        Wash wash = new Wash();          //洗衣机
        outlet = wash;                   //洗衣机插在三相插座上
        System.out.println("使用三相插座接通电流:");
        outlet.connectElectricCurrent();  //接通电流,开始洗衣服
        TV tv = new TV();                //电视机
        ThreeElectricAdapter adapter = new ThreeElectricAdapter(tv);  //把电视机插在适配器上
        outlet = adapter;                //适配器插在三相插座上
        System.out.println("使用三相插座接通电流:"); 
        outlet.connectElectricCurrent();  //接通电流,开始播放电视节目
    }

}
复制代码

 

运行结果如下:

使用三相插座接通电流:
黄河洗衣机开始洗衣服。
使用三相插座接通电流:
长江电视机开始播放节目。
分享到:
评论

相关推荐

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    C#设计模式学习笔记

    以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...

    《C++20设计模式》学习笔记-第6章适配器模式学习代码

    《C++20设计模式》学习笔记-第6章适配器模式学习代码

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    Head.First 设计模式学习笔记.pdf

    ### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...

    java设计模式学习笔记,以及各种模式的代码实现

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。这些模式是面向对象编程中的一种最佳实践,通过标准化的方式处理常见的设计问题。下面...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    根据《JAVA与设计模式》整理的笔记及示例代码

    这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...

Global site tag (gtag.js) - Google Analytics