`
qzriso
  • 浏览: 242632 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

设计模式之适配器模式

阅读更多

适配器(Adapter)模式 定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。

      适配器(Adapter)模式分类:
        1:类的适配器模式;

        2:对象的适配器模式。

      假想示例说明:假设图片出版后由总公司负责销售,总公司对于图书的销售有两种:
        1:实施一系列的促销方式,例如打折;

        2:招代理商,让代理商负责销售,给一定的折扣。

      存在的问题:两种方式都存在计算图书最终价格的方式,而不太理想的是这两个方式实现的接口并不统一,原因可能是多方面的,公司打折方式计算图书最终体格的 接口为promotionPrice,而代理商方式所定义的接口为proxyPrice。现在公司想在业务上统一计算图书价格的逻辑,这样就可以应用适配 器模式来解决。

      公司实施促销的业务逻辑代码:



interface IPromotion
    {
        /// <summary>
        /// 图书正常打折后的价格接口
        /// </summary>
        /// <returns></returns>
        double promotionPrice();
    }
public class computerBook:IPromotion
    {
        /// <summary>
        /// 计算机图书打八折后的价格
        /// </summary>
        /// <returns></returns>
        public double promotionPrice()
        {
            return bookprice * 0.8;
        }
        /// <summary>
        /// 图书价格
        /// </summary>
        double bookprice;
        public computerBook(double _bookprice)
        {
            this.bookprice = _bookprice;
        }
    }



给代理商销售的价格计算代码:



interface IProxy
    {
        /// <summary>
        /// 代理商打折后的价格接口
        /// </summary>
        /// <returns></returns>
        double proxyPrice();
    }
  public class diamondProxy:IProxy
    {
        /// <summary>
        /// 钻石代理商打八折后的价格
        /// </summary>
        /// <returns></returns>
        public double proxyPrice()
        {
            return bookprice * 0.8;
        }
        /// <summary>
        /// 图书价格
        /// </summary>
        double bookprice;
        public diamondProxy(double _bookprice)
        {
            this.bookprice = _bookprice;
        }
    }



解决方案:可以把公司的促销方式定义的接口IPromotion做为目标接口,把代理商的接口IProxy 转换成IPromotion。下面分别用类适配器和对象适配器来实现。


        第一:类适配器方式:所涉及的角色包括:

            1:目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
            2:源(Adaptee)角色:需要适配的类。
            3:适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类。

        类适配器结构图:


 附件: 抱歉,您所在的用户组没有浏览该资源的权限。        

          类适配器代码:



/// <summary>
    /// 类适配器,同时继承被适配者(Adaptee)和目标接口IPromotion
    /// </summary>
    public class AdapterPriceClass:diamondProxy , IPromotion
    {
        /// <summary>
        /// 转换接口
        /// </summary>
        /// <returns>代理商打折后的图书价格</returns>
        public double promotionPrice()
        {
            return this.proxyPrice();     
        }
        /// <summary>
        /// 图书价格
        /// </summary>
        double price;
        /// <summary>
        /// 构造函数,接受图书价格,同时实例化Adaptee
        /// </summary>
        /// <param name="_price"></param>
        public AdapterPriceClass(double _price):base(_price )
        {
            this.price = _price;       
        }
    }



第二:对象适配器方式:所涉及的角色包括:

              1:目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
              2:源(Adaptee)角色:需要适配的类。
              3:适配器(Adapter)角色:通过在内部包装(Wrap)一个Adaptee对象,把源接口转换成目标接口。

        对象适配器结构图:


 附件: 抱歉,您所在的用户组没有浏览该资源的权限。        

        对象适配器代码:



/// <summary>
    /// 对象适配器,只继承目标接口
    /// </summary>
    public class AdapterPriceObject:IPromotion
    {   
        /// <summary>
        /// 接口转换
        /// </summary>
        /// <returns></returns>
        public double promotionPrice()
        {
            return this.proxy.proxyPrice();           
        }       
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="_proxy">代理商实例</param>
        public AdapterPriceObject(IProxy _proxy)
        {
            this.proxy = _proxy;
        }
        /// <summary>
        /// 代理商实例
        /// </summary>
        IProxy proxy;
    }



客户端调用方式:



//类适配器调用方式
            //类适配器中,被适配者一定是一个类,即一个适配器对应一个适配类,所以适配器就代表了被适配者
            //也就是说下面的AdapterPriceClass就代表了diamondProxy
            IPromotion _IPromotion = new AdapterPriceClass(100.0);
            Response.Write(_IPromotion.promotionPrice());

            //对象适配器调用方式
            //对象适配器中,被适配者可以是一个类也可以是一个接口,下面的例子中就是一个接口
            //先实例了一个代理商
            diamondProxy _proxy = new diamondProxy(100.0);
            //给适配器传递参数
            IPromotion _IPromotionObject = new AdapterPriceObject( _proxy);
            Response.Write(_IPromotionObject.promotionPrice());



类适配器与对象适配器的比较:
        1:类适配器需要继承目标接口和被适配者,而对象适配器只需要继承目标接口,这样在耦合度上对象适配器占优势;
        2:从扩展性上来看,因为类适配器方式要继承具体的被适者,上面的例子就是具体的代理商,也就是说类适配器需要为每个被适配者写一个适配器,无论被适配者是否是存在多态关系。而对象适配器则可以解决这种问题。

      适用场合:

          1:系统需要使用现有的类,而此类的接口不符合系统的需要。
          2: 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
          3:(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

      总结:

              本文应用适配器模式比较完美的解决了两种不同方法签名名的计算图书价格的问题。分析了类适配器和对象适配器的应用和区别。

注:

本文引用:
C#设计模式(10)-Adapter Pattern

《Java与模式》


文/姜敏   出处/博客园

分享到:
评论

相关推荐

    Java设计模式之适配器模式

    ### Java设计模式之适配器模式详解 #### 引言 在软件开发中,我们经常遇到需要使用已有的类库,但这些类库的接口与我们的需求不匹配的情况。这时,适配器模式(Adapter Pattern)便能派上用场。适配器模式是一种...

    设计模式之适配器模式与外观模式demo

    在软件设计领域,设计模式是一种经过时间和实践验证的解决方案,用于解决常见的...这个"设计模式之适配器模式与外观模式demo"资源为学习和实践这两种模式提供了宝贵的实例,对于提升编程技能和设计思维具有积极意义。

    深入浅出设计模式之适配器模式与外观模式

    ### 深入浅出设计模式之适配器模式与外观模式 在软件工程领域,设计模式被广泛地应用于解决常见的编程问题。其中,《Head First 设计模式》是一本非常受欢迎的经典著作,它通过生动有趣的例子帮助读者理解并掌握...

    java设计模式之适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...

    设计模式之适配器模式Java实现和类设计图

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不兼容的接口之间进行通信。在这个Java实现中,我们将深入探讨适配器模式的两大类型:类适配器模式和对象适配器模式,并通过具体的代码示例和...

    设计模式之 适配器 Adapter C++ 源码

    设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式...

    设计模式之适配器模式(Adapter Pattern)

    适配器模式是软件设计模式中的一种,它的主要目的是解决接口不兼容问题,使得原本由于接口差异无法协同工作的类能够协同工作。在实际的软件开发过程中,我们常常遇到这样的情况:旧有的系统或第三方库提供了丰富的...

    设计模式之适配器模式.docx

    适配器模式是一种设计模式,它的主要目的是解决接口不兼容的问题,使得原本因接口差异而无法协同工作的类能够一起工作。适配器模式的核心思想是通过一个中间适配器类来转换不同接口,使得原有类(被适配者)能够符合...

    java设计模式之适配器模式.zip

    适配器模式是一种在软件设计中广泛使用的结构型设计模式,它的主要目的是使不兼容的接口之间能够进行通信。在Java编程中,适配器模式能够帮助我们复用已有的类,或者解决新旧系统之间的接口不匹配问题,从而提高代码...

    JAVA设计模式之适配器模式.docx

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式被广泛应用于各种场景,如文件描述符的处理和框架的日志记录。下面我们将深入探讨适配器模式的核心概念、结构、使用场景...

    23钟设计模式之适配器模式

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在上述代码示例中,适配器模式被用来解决洗衣机(Wash)和电视机(Tv)与不同插座接口(SanXiangChaZuo 和 ErXiangChaZuo)之间的兼容性问题。...

    c++-设计模式之适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户端期望的另一个接口。适配器模式常用于解决由于接口不兼容而无法正常工作的类之间的协作问题。 适配器模式的组成 目标接口(Target...

    Java 23种设计模式10适配器模式.pdf

    ### Java设计模式之适配器模式详解 #### 结构型模式概述 在软件工程领域,设计模式被视为一种标准解决方案,用于解决在特定上下文中经常出现的问题。设计模式按其目的和适用场景,大致可分为三种类型:创建型模式...

    [结构型模式] head first 设计模式之适配器模式(Adapter)

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在软件工程中,当系统中存在一个已经存在的组件,但其接口不符合当前项目的需求时,适配器模式就能发挥作用。通过适配器,我们可以复用现有的...

Global site tag (gtag.js) - Google Analytics