zoukankan      html  css  js  c++  java
  • 7 适配器模式

    适配器模式(Adaptor):将一个类的接口转换成客户希望的另一个接口。适配器让原本接口不兼容的类可以一起工作。

    类似于我们日常生活中的电源适配器,提供了低压直流电和220V交流电之间的适配。

    适配器有两种形式:对象适配器和类适配器。两者的类图分别如下:

    对象适配器:

    对象适配器

    Adapter完成Target和Adaptee之间的适配,这里Client相当于笔记本,Target为低压直流电,Adaptee为220V交流电,Adapter为电源适配器。Adapter继承了Target,并与Adaptee关联。

    再来看看类适配器是什么样的:

    类适配器

    类适配器与对象适配器的区别在于类适配器使用了多继承,Adapter同时继承了Target和Adaptee。但是,C#、Java等语言都不支持多继承(c++支持)。这里也就不做学习了。

    对象适配器的简单代码如下,适配器用来进行迭代器(Iterator)到枚举器(Enumerator)的转换,以便让Client可以正常使用Enumerator。 

    //Client
        public class Enumerator
        {
            public bool HasMoreElements()
            {
                return true;
            }
    
            public object NextElement()
            {
                return new object();
            }
        }
        //Adaptee
        public class Iterator
        {
            public virtual bool HasNext()
            {
                return true;
            }
    
            public virtual object Next()
            {
                return new object();
            }
    
            public virtual void Remove(int i)
            {
    
            }
        }
        //Adaptor
        public class EnumeratorIteratorAdaptor : Iterator
        {
            Enumerator enumerator;
            public EnumeratorIteratorAdaptor(Enumerator enumerator)
            {
                this.enumerator = enumerator;
            }
            public override bool HasNext()
            {
                return enumerator.HasMoreElements();
            }
            public override object Next()
            {
                return enumerator.NextElement();
            }
            public override void Remove(int i)
            {
                throw new Exception("不支持Remove()方法");
            }
        }
    View Code

    .NET中的DataAdapter就是适配器。但适配器往往只是在实在没有办法的时候才使用,比如像复用旧的类,想使用第三方的类但又不愿跟随第三方的设计,即在双方都不容易修改为统一格式的情况下,再使用适配器。如果是自己设计两个类,当然是要直接设计成两者可以配合。

    《大话设计模式》中还提到了扁鹊的故事,真是很好的例子:

    扁鹊

  • 相关阅读:
    hdu5247找连续数(打表)
    hdu5246超级赛亚ACMer
    hdu5246超级赛亚ACMer
    cf534D 枚举握手次数
    cf534D 枚举握手次数
    4467奇妙的方式优化暴力的01边查询
    4467奇妙的方式优化暴力的01边查询
    POJ1364基本的查分约束问题
    POJ1364基本的查分约束问题
    poj1509最小表示法
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/6064255.html
Copyright © 2011-2022 走看看