首页 > 程序开发 > Web开发 > ASP.Net >

步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)

2011-04-08

概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用

概述

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。

意图

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

结构图

图1 类的Adapter模式结构图

图2 对象的Adapter模式结构图

生活中的例子

适配器模式允许将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。扳手提供了一个适配器的例子。一个孔套在棘齿上,棘齿的每个边的尺寸是相同的。在美国典型的边长为1/2和1/4。显然,如果不使用一个适配器的话,1/2的棘齿不能适合1/4的孔。一个1/2至1/4的适配器具有一个1/2的阴槽来套上一个1/2的齿,同时有一个1/4的阳槽来卡入1/4的扳手。

图3使用扳手适配器例子的适配器对象图

示例图用例设计:

1

先创建User.cs

    public class User
    {
        public int ID
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        public string Age
        {
            get;
            set;
        }
    }
 
然后再新建IDBHelper.cs
    public interface IDBHelper
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        /// <returns></returns>
        string DBConnectString();
        /// <summary>
        /// 返回结果集
        /// </summary>
        /// <param name="strsql"></param>
        /// <returns></returns>
        DataSet GetUserGroup(string strsql);
        /// <summary>
        /// 返回插入的行数
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        int InsertUser(User user);
    }
 
然后再新建SQLHelper.cs:
 public  class SQLHelper:IDBHelper
    {
        #region IDBHelper 成员

        public string DBConnectString()
        {
            return "SQL Connect String";
        }

        public DataSet GetUserGroup(string strsql)
        {
            DataSet ds = new DataSet();
            return ds;
        }

        public int InsertUser(User user)
        {
            return 1;
        }

        #endregion
    }
然后再新建OracleHelper.cs:
 public  class OracleHelper:IDBHelper
    {
        #region IDBHelper 成员

        public string DBConnectString()
        {
            return "Oracle Connect String.";
        }

        public DataSet GetUserGroup(string strsql)
        {
            DataSet ds = new DataSet();
            return ds;
        }

        public int InsertUser(User user)
        {
            return 1;
        }

        #endregion
    }

然后再建DataContent.cs:

  public class DataContent:IDBHelper
    {
        private IDBHelper DbHelper = GetDBHelper();
        public static IDBHelper GetDBHelper()
        {
            
 string strClass = ConfigurationSettings.AppSettings["DBHeper"].ToString();
 Assembly assembly =  Assembly.Load("Adapter");
 IDBHelper dbHelper = assembly.CreateInstance(strClass) as IDBHelper;
            return dbHelper;
        }

        #region IDBHelper 成员

        public string DBConnectString()
        {
            return DbHelper.DBConnectString();
        }

        public System.Data.DataSet GetUserGroup(string strsql)
        {
            return DbHelper.GetUserGroup(strsql);
        }

        public int InsertUser(User user)
        {
           return DbHelper.InsertUser(user);
        }

        #endregion
    }

在App.config里加下面代码:

  <appSettings>
    <add key="DBHeper" value="Adapter.SQLHelper"/>
   <!--<add key="DBHeper" value="Adapter.OracleHelper"/>-->
  </appSettings>

看我们的调用程序:

    public partial class Run : Form
    {
        public Run()
        {
            InitializeComponent();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
  
            DataContent dataContent = new DataContent();
            rtbResult.AppendText(dataContent.DBConnectString());
        }
    }

结果如图:

image

热点推荐