设计模式 之 适配器

适配器模式(Adapter)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

在我们生活中存在很多适配器的例子,如插座转换器、笔记本电脑电源适配器等。今天,我们就来看一下嘴熟悉的笔记本电源适配器的例子。通常,笔记本电脑需要的电流都是12-20V以内的直流电流,而我们家庭用电通常是220V的交流电,当然还有工业用电380V交流电,还有更低的110V交流电源。如何把这些不同的交流电源转换成笔记本电脑需要的直流电呢?这就需要电源适配器。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 适配器
{
    //电源基类
    public class BasePower
    {
        //电压值
        private float power;
        //单位
        private string unit = "V";
        //构造方法
        public BasePower(float power)
        {
            this.power = power;
        }

        public float Power
        {
            get { return power; }
            set { power = value; }
        }

        public string Unit
        {
            get { return unit; }
            set { unit = value; }
        }

    }
    //交流电源接口
    public interface IPower
    {
        //输出交流电
        void output();
    }

    //交流电源
    public class Power : BasePower,IPower
    {
        //构造方法
        public Power(float power) : base(power) { }
        //电源输出
        public void output()
        {
            Console.WriteLine("这是" + this.Power + this.Unit + "交流电源!");
        }
    }

    //12V直流电源接口
    public interface IPower12
    {
        void output12v();
    }

    //12V直流电源
    public class Power12 : BasePower,IPower12
    {
        public Power12(float power) : base(power) { }
        public void output12v()
        {
            Console.WriteLine("这是" + this.Power + this.Unit + "直流电源!");
        }
    }

    //电源适配器(实现目标对象接口,即12V电源接口)
    public class AdapterPower12 :IPower12
    {
        //待转换的交流电源
        private BasePower basePower;

        //适配器构造方法,将待转换对象传入
        public AdapterPower12 (BasePower basePower)
        {
            this.basePower = basePower;
        }
        //实现目标对象方法
        public void output12v()
        {
            //获得外部电源值
            float powerFloat = this.basePower.Power;
            //进行电源转换
            if (powerFloat == 380)
            {
                //380V电源转换
                powerFloat = powerFloat / 31.67f;
            }
            else if (powerFloat == 220)
            {
                //220V电源转换
                powerFloat = powerFloat / 18.33f;
            }
            else if(powerFloat==110)
            {
                //110V电源转换
                powerFloat = powerFloat / 9.17f;
            }
            else
            {
                Console.WriteLine("不能适配电源!");
                return;
            }

            powerFloat = (int)(powerFloat * 10) / 10.0f;
            Console.WriteLine("这是" + powerFloat + this.basePower.Unit + "直流电源!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //首先生成一个220V电源对象!
            Power power220 = new Power(220);
            power220.output();

            //生成一个12V电源对象
            IPower12 power12 = new Power12(12);
            power12.output12v();

            Console.WriteLine();

            //使用电源适配器将220V电源转换成12V电源
            Console.WriteLine("电源适配器转换中");
            IPower12 adapterPower12 = new AdapterPower12(power220);
            adapterPower12.output12v();
            Console.WriteLine("电源适配器转换结束!");
        }
    }
}

适配器的类图

    在对象适配器模式结构图中包含如下几个角色:

Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。

Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

主要优点:

1.将目标类和适配者类解耦

2.增加了类的透明度和复用性

3.灵活性好和扩展性好

使用场合:

1.软件系统结构需要升级或扩展,又不想影响原有系统的稳定运行的时候

2.转换类之间的差别不是太大的时候

3.想创建一个可以复用的类,该类可以与其他不想管的类或不可预见的类协同工作的时候

适配器主要用于系统的升级扩展,或者版本兼容性上,没有哪一个系统分析师会在软件设计阶段使用适配器模式的。适配器可以很好的解决版本兼容问题。另外,就是原有类和新的接口标准不能差别太大,否则,适配器是达不到预期效果的。适配器在软件的后期维护中具有很大的优势,它不仅能保持原有系统的稳定,而且还能进行新功能的扩展。

与桥接和装饰的区别

1.与桥接的区别:适配器是将一种接口转换为另一种接口的设计模式,而桥接则是把实现和它的接口分开,以便它们可以独立地变化。桥接并不是用来把一个已有的对象接到不相匹配的接口上的。

2.与装饰的区别:适配器主要用来填补两个接口之间的差异,而装饰则是不需要更改接口,就可以新增功能的设计模式。

时间: 2024-08-05 07:07:58

设计模式 之 适配器的相关文章

设计模式--重温--适配器

实际场景: Eric有一台旧电脑,旧电脑的容量是40g.最近Eric迷恋上的电影(电影类型是:此处省略100字),这是他想把电影保存到硬盘,而容量又特别小,需要在多加一块1T的硬盘,之前老硬盘的接口是IDE的, 而现在的硬盘基本上都是SATA接口的硬盘,所以装机人员就使用了一条"转接线",这条线的作用就是将SATA接口的硬盘可以插在IDE接口上. 这里就出现了一个适配器的原型: IDE接口  就是  目标接口    转接线  就是 适配器   SATA接口  就是 要适配的接口 UML

Java设计模式之适配器

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数.” 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢? “没关系的.”你的leader安慰你道:“功能其实很简单的,接口都已经提供好了,你只需要调用一下就行

Java读源码学设计模式:适配器Adapter

适配器模式相关源码:slf4j-1.6.1.hibernate-3.6.7 大家都知道,log4j是一个广泛使用的日志工具,除此之外,sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger.当然还有其他一些日志工具. 多种日志工具功能和使用方式类似,一般都包含debug.info.warn.error等日志级别的方法,但却没有实现共同的接口.这一点不像JDBC,虽然关系型数据库种类很多,例如MySQL.Oracle等,但是有一套统一的接口,也就是JDBC.

设计模式 8 —— 适配器和外观模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 6 —— 单件模式 设计模式 7 —— 命令模式 设计模式 8 —— 适配器和外观模式 概述 第1部分 问题引入 第2部分 适配器模式定义 第3部分 对象和类的适配者 第4 部分 适配器模式与装饰者模式区别 第5 部分 外观模式 第1 部分 问题引入 OO适配器是什么,现实中到处都是.比

理解设计模式(适配器)

适配器模式,转换不同接口,实现兼容. 特定环境 接口兼容—使用现有类,但使用方式与原有方式不同,需要转换—现有接口兼容第三方组件—保留并使用原系统类的功能,但客户端访问方式发生变化,同时无法修改原有代码时 相近功能类间的转换 一类问题 接口不兼容的类,不能协同合作 解决方案 3个角色: 目标接口 Target : 提供期待的使用方式,由类或接口实现 被适配者 Adaptee : 类原有使用方式,由类或接口实现 适配器 Adapter : 封装Adaptee引用,实现或继承Target,重写Tar

设计模式模式适配器(Adapter)摘录

23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模型的建立也将委托实例化一个对象. 断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来. 第二.它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口. 因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了

PHP设计模式系列 - 适配器

什么是适配器: 适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口. 设计情景: 假如我们原始的有一个UserInfo的类,提供用户信息的类,早起设计该类的时候,只实现了一个getUserName获取用户名的方法. 我们的MyOldObject类中,将从UserInfo这个类中获取用户信息,并且输出用户名 随着时间的推移,我们旧的UserInfo这个类只提供的获取用户名的方法,已经没法满足需求,我们同时需要获取用户的年龄等信息. 为了不改变原本UserInfo这个类,我们就继承Use

设计模式_适配器

//类适配器 #include<memory> #include<iostream> using namespace std; class Target { public: virtual void request(){ cout << "Target::Request"<<endl; } }; class Adaptee{ public: void SpecificRequest(){ cout << "adapt

设计模式之适配器

今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数.” 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢? “没关系的.”你的leader安慰你道:“功能其实很简单的,接口都已经提供好了,你只需要调用一下就行了.” 好吧,你勉为其难地接受了,对于这种突如其来的新需求,你早已习惯. 你的leader向你具体描述了一下需求,你们的游戏目前有