首页 > 设计模式 > 初尝Adaptor 模式

初尝Adaptor 模式

适配器的概念,生活中随处可见。比如,一款ps2的鼠标给你,而你需要在笔记本上使用的时候,这个时候你可能需要一个ps2转USB的转接头了。这样的转接头,和我们今天需要理解的Adaptor 的概念很类似。在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是Adaptor 模式了。

意图

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

结构图

对象适配器 初尝Adaptor 模式图1-对象的适配器

类适配器 初尝Adaptor 模式图2-类的适配器

现在假设我们需要更新一个程序的日志模块。原有的日志模块预留的接口仅仅提供一个Log() 方法,而新的日志模块提供数据库日志(DatabaseLog)和文件日志(FileLog)2种方法。但,目标程序本身大量的使用了老接口的Log() 方法,且已经通过了各种测试,因此我们不太愿意去修改接口以适应新的模块。

这个时候该Adaptor 上场了,下面是代码:

using System;
using System.Configuration;
using System.Reflection;

namespace Adaptor
{
    #region 新的接口
    public interface INewLog {
        void WriteLog();
    }

    public class DatabaseLog : INewLog {
        public void WriteLog() {
            Console.WriteLine("Write To Database!");
        }
    }

    public class FileLog : INewLog {
        public void WriteLog() {
            Console.WriteLine("Write To File");
        }
    }
    #endregion

    #region 原始的目标接口
    public interface ILog {
        void Log();
    }
    #endregion

    #region 类.适配器
    public class DatabaseLogAdaptor : DatabaseLog, ILog {
        public void Log() {
            //或者对DatabaseLog.WriteLog 进行适当重写
            this.WriteLog();
        }
    }

    public class FileLogAdaptor : FileLog, ILog {
        public void Log() {
            //或者对FileLog.WriteLog 进行适当重写
            this.WriteLog();
        }
    }
    #endregion

    #region 对象.适配器
    public class Adapter : ILog {
        private INewLog _adaptee;
        public Adapter(INewLog  adaptee) {
            this._adaptee = adaptee;
        }

        public void Log() {
            this._adaptee.WriteLog();
        }
    }
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            ILog log;
            //使用对象适配器
            string ObjectAdapter = ConfigurationManager.AppSettings["ObjectAdapter"].ToString();
            log = new Adapter((INewLog)Assembly.Load("Adaptor").CreateInstance("Adaptor." + ObjectAdapter));
            log.Log();
            //使用类适配器
            string ClassAdapter=ConfigurationManager.AppSettings["ClassAdaptor"].ToString();
            log = (ILog) Assembly.Load("Adaptor").CreateInstance("Adaptor." + ClassAdapter);
            log.Log();
        }
    }
}

配置文件



  
    
    
  

运行截图

适配器运行结果 初尝Adaptor 模式

总结:

Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。比较2种适配器,对象适配器似乎更符合“单一职责”的面向对象精神。不难发现的是,面向接口是整个模式设计的前提。

分类: 设计模式 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.