七、适配器(Adapter)模式--结构模式(Structural Pattern)

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

类的 Adapter模式的结构:

类适配器类图:

由图中可以看出,Adaptee 类没有 Request方法,而客户期待这个方法。为了使客户能够使用 Adaptee 类,提供一个中间环节,即类Adapter类,

Adapter 类实现了 Target 接口,并继承 自 Adaptee,Adapter 类的 Request 方法重新封装了Adaptee 的SpecificRequest方法, 实现了适配的目的。
因为 Adapter 与 Adaptee 是继承的关系,所以这决定了这个适配器模式是类的。

该适配器模式所涉及的角色包括:
  目标(Target)角色:这是客户所期待的接口。因为 C#不支持多继承,所以 Target 必须是接 口,不可以是类。

  源(Adaptee)角色:需要适配的类。

   适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类。

示例代码:

class Program
    {
        static void Main(string[] args)
        {
            ITarget t = new Adapter();
            t.Request();
            Console.ReadKey();
        }
    }

    interface ITarget
    {
        void Request();
    }

    class Adaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine(" Call SpecificRequest();");
        }
    }

    class Adapter : Adaptee, ITarget
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }

运行结果:

 对象的 Adapter模式的结构

对象的Adapter模式类图:

从图中可以看出:客户端需要调用 Request方法,而Adaptee 没有该方法,为了使客户端能 够使用 Adaptee 类,需要提供一个包装(Wrapper)类 Adapter。

这个包装类包装了一个 Adaptee 的实例,从而将客户端与 Adaptee 衔接起来。由于 Adapter 与 Adaptee 是委派关 系,这决定了这个适配器模式是对象的。

该适配器模式所涉及的角色包括:
  目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  源(Adaptee)角色:需要适配的类。

   适配器(Adapter)角色:通过在内部包装(Wrap)一个 Adaptee 对象,把源接口转换成目 标接口。

示例代码:

    class ObjectAdapter
    {
        public static void Main(string[] args)
        {
            Target t = new Adapter();
            t.Requtest();
            Console.ReadKey();
        }
    }

    public class Target
    {
        virtual public void Requtest()
        {

        }
    }

    class Adaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("Call Adaptee.SpecificRequest();");
        }
    }

    public class Adapter : Target
    {
        Adaptee adaptee = new Adaptee();
        public override void Requtest()
        {
            adaptee.SpecificRequest();
        }
    }

运行结果:

在以下各种情况下使用适配器模式:
  1、 系统需要使用现有的类,而此类的接口不符合系统的需要。

  2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可 能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

  3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式, 就要针对每一个子类做一个适配器,而这不太实际。

Adapter模式在实现时有以下这些值得注意的地方:
  1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee 不必实现不需要的方法(可以参考 Default Adapter 模式)。其

    表现形式就是父类实现缺省方 法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。     

  2、 适配器类可以是抽象类。

  3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。

时间: 2024-08-07 14:01:41

七、适配器(Adapter)模式--结构模式(Structural Pattern)的相关文章

九、 合成(Composite)模式 --结构模式(Structural Pattern)

合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 安全式合成模式类图: 抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象.在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出. 树叶构件(Leaf)角色:树叶对象是没有下级子对象的对 象,

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

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

java演示适配器(adapter)模式

为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并实现了这个接口,这个接口中的方法在自己的类库中有更好的实现方式,但是方法名不一样,不能为用户所用,可以定义一个类实现这个接口,这个接口中的方法可以委托给自己类库中的方法实现效果,以满足客户的需求.这种方式叫做接口适配. // 已存在的.具有特殊功能.但不符合我们既有的标准接口的类 class Ada

Android 适配器(Adapter)、观察者(Observer) 模式

适配器(Adapter)详述:http://blog.csdn.net/jjwwmlp456/article/details/39893723 观察者(Observer)详述:http://blog.csdn.net/jjwwmlp456/article/details/39967021 AdapterView 体系 AdapterView中会使用Adapter Adapter 体系 BaseAdapter 实现了 SpinnerAdapter.ListAdapter 这样的形式,就是 适配器模

设计模式--适配器(Adapter)模式

今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)>http://www.cnblogs.com/insus/archive/2013/02/04/2891426.html ,但是似乎没有适配器的味道. 比如一个系统,开发时设计好各种权限,但某一种,客户提出要求,需要一个特殊的权限来操作.只好开发一个适配器来让其有这个特殊操作权限. 用代码来举例吧. 先定

c++ 结构型模式-适配器(Adapter)

1) 意图: 将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 2) 结构: 适配器两种结构,一种继承实现,一种组合实现 a. 继承方式: b. 组合方式: 其中: Target定义Client使用的与特定领域相关的接口 Client与符合Target接口的对象协同 Adaptee定义一个已经存在的接口,这个接口需要适配 Adapter对Adaptee的接口与Target接口进行适配 3) 适用性: 想使用一个类,但是它的接口不符合要求

设计模式(二)结构模式

GOF论述了23种设计模式,它们有3个分类----创建型模式.结构型模式.行为模式.此篇为结构型模式结构型模式所所关注的问题是:如何将类和对象进行组合以便获取功能更加庞大的结构?一般情况下,结构型模式都是使用继承机制将接口进行组合以及实现. 导入问题:使用继承的缺点|-----对象的继承关系在编译时就已经确定,所以运行时子类无法改变从父类继承来的实现,即子类对父类有很强的依赖性.|-----继承所带来的子类与父类的强依赖关系限制了复用性和程序的灵活性. *********************

[JAVA设计模式]第三部分:结构模式

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任! 结构模式... 52 适配(Adapter)器模式... 52 类适配器模式结构... 52 对象适配器结构... 53 从Iterator到Enumeration的适配... 54 从Enumeration到Iterator的适配... 54 缺省适配(Default Adapter)器模式... 55 模式结构... 56 与适配器模式区别... 56 J2EE中的缺省适配模式... 5

设计模式(七) : 结构型模式--适配器模式

适配器模式主要是为了解决接口不符合系统需要的问题.分成类的适配器和对象的适配器. 1. 类的适配器: 示意性代码: package com.javadesignpattern.Adapter; public interface Target { public void sampleOperation1(); public void sampleOperation2(); } package com.javadesignpattern.Adapter; public class Adaptee {