文章出處

類的適配器模式
using System;

/// 這里以插座和插頭的例子來詮釋適配器模式
/// 現在我們買的電器插頭是2個孔,但是我們買的插座只有3個孔的
/// 這是我們想把電器插在插座上的話就需要一個電適配器
namespace 設計模式之適配器模式
{
    /// <summary>
    /// 客戶端,客戶想要把2個孔的插頭 轉變成三個孔的插頭,這個轉變交給適配器就好
    /// 既然適配器需要完成這個功能,所以它必須同時具體2個孔插頭和三個孔插頭的特征
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            // 現在客戶端可以通過電適配要使用2個孔的插頭了
            IThreeHole threehole = new PowerAdapter();
            threehole.Request();
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 三個孔的插頭,也就是適配器模式中的目標角色
    /// </summary>
    public interface IThreeHole
    {
        void Request();
    }

    /// <summary>
    /// 兩個孔的插頭,源角色——需要適配的類
    /// </summary>
    public abstract class TwoHole
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是兩個孔的插頭");
        }
    }

    /// <summary>
    /// 適配器類,接口要放在類的后面
    /// 適配器類提供了三個孔插頭的行為,但其本質是調用兩個孔插頭的方法
    /// </summary>
    public class PowerAdapter:TwoHole,IThreeHole
    {
        /// <summary>
        /// 實現三個孔插頭接口方法
        /// </summary>
        public void Request()
        {
            // 調用兩個孔插頭方法
            this.SpecificRequest();
        }
    }
}
對象的適配器模式
namespace 對象的適配器模式
{
    class Client
    {
        static void Main(string[] args)
        {
            // 現在客戶端可以通過電適配要使用2個孔的插頭了
            ThreeHole threehole = new PowerAdapter();
            threehole.Request();
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 三個孔的插頭,也就是適配器模式中的目標(Target)角色
    /// </summary>
    public class ThreeHole
    {
        // 客戶端需要的方法
        public virtual void Request()
        {
            // 可以把一般實現放在這里
        }
    }

    /// <summary>
    /// 兩個孔的插頭,源角色——需要適配的類
    /// </summary>
    public class TwoHole
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是兩個孔的插頭");
        }
    }

    /// <summary>
    /// 適配器類,這里適配器類沒有TwoHole類,
    /// 而是引用了TwoHole對象,所以是對象的適配器模式的實現
    /// </summary>
    public class PowerAdapter : ThreeHole
    {
        // 引用兩個孔插頭的實例,從而將客戶端與TwoHole聯系起來
        public TwoHole twoholeAdaptee = new TwoHole();

        /// <summary>
        /// 實現三個孔插頭接口方法
        /// </summary>
        public override void Request()
        {
            twoholeAdaptee.SpecificRequest();
        }
    }
    
}

在以下情況下可以考慮使用適配器模式:

  1. 系統需要復用現有類,而該類的接口不符合系統的需求
  2. 想要建立一個可重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()