[Design Pattern] 橋接器模式 Adapter Pattern

Adapter => 我不會講台語 透過媽媽當翻譯 間接跟阿公溝通 

              => 媽媽就是 Adapter = 橋接器

 

什麼情況下用的到?

前提: 我想用一樣的方式操作所有東西

要解決的問題: 目標不好用、為了降低與目標的藕合、目標還在開發中可能一直變、我得一直配合他改......

 

這是一個很簡單的Pattern

所以直接看程式碼


using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Database msSql = new MsSql();
            msSql.GetMember(1);

            Database oracleAdpt = new OracleAdapter();
            oracleAdpt.GetMember(1);     //透過 Adapter 把行為包裝成一樣

            Oracle oracle = new Oracle();  
            oracle.GetMembers("Tom");    //直接叫用 Oracle 會導致行為不一樣
        }
    }

    abstract class Database
    {
        /// <summary>
        /// 本來大家說好 GetMember 都是用 ID 查
        /// </summary>
        public abstract void GetMember(int id);
    }

    class MsSql : Database
    {
        /// <summary>
        /// MS-SQL 合法
        /// </summary>
        public abstract void GetMembers(int id)
        {
            //開資料庫查
        }
    }

    class Oracle
    {
        /// <summary>
        /// Oracle 亂來,變成用名子查
        /// </summary>
        public void GetMembers(string name)
        {
            //開資料庫查
        }
    }

    /// <summary>
    /// Oracle 轉接器
    /// </summary>
    class OracleAdapter : Database
    {
        //要取代的類別 new 在 Adapter中
        private Oracle _Oracle = new Oracle();

        /// <summary>
        /// 我來讓大家用一樣的方法操作 Oracle
        /// </summary>
        public override void GetMembers(int id)
        {
            //假設我先用 id 找出名子
            var name = "Tom";

            _Oracle.GetMembers(name);
        }
    }
}

 

其實這篇的重點是 Adapter 與 Proxy 的差別

Proxy     與 真實物件 之間不改程式碼就可互相取代

Adapter 與 真實物件 之間要改程式碼才可互相取代

 

複習一下 Proxy (與真實物件繼承同一個父類別)

=> 所以我直接把程式碼裡所有出現 Proxy 的 直接改成 RealClass 編譯會過

class RealClass : BaseClass
class Proxy     : BaseClass

 

再看一下 Adapter (真實物件沒繼承同一個父類別)

=> 所以我直接把程式碼裡所有出現 Adapter 的 直接改成 RealClass 編譯不會過

abstract class Database

class MsSql         : Database
class Oracle
class OracleAdapter : Database