K書記錄-大話設計模式-配接器

配接器概念&範例

任務 : 執行請求

UML : 

1.建立一般的請求

程式碼 : 

    public class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("Noraml Request.");
        }
    }

說明 : 只有一個”一般的方法”

 

2.建立那個特別的請求

程式碼 : 

    public class Adaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("Specific Request.");
        }
    }

說明 : 就他不一樣,特別寫出一個類別

 

3.建立接口

程式碼 : 

    public class Adapter : Target
    {
        private Adaptee Adaptee = new Adaptee();
        public override void Request()
        {
            Adaptee.SpecificRequest();
        }
    }

說明 : 繼承一般請求,並把原請求替換成特殊請求(硬換)

 

4.使用方式

程式碼 : 

        static void Main(string[] args)
        {
            Target target = new Adapter();
            Target target1 = new Target();
            Target target2 = new Target();

            List<Target> targets = new List<Target>()
            {
                target,target1,target2
            };

            foreach (var item in targets)
                item.Request();
            Console.ReadLine();
        }

說明 : 

  1. 建立特殊請求target 
  2. 建立一般請求target1
  3. 建立一般請求target2
  4. 組成請求列表
  5. 呼叫所有請求

小結 : 

這個案例的狀況是在平凡的一般請求中來一個程咬金特殊請求,為了配合他硬是加了一個硬是修改原來的方法改成特殊方法,不過一開始有規劃到這個特殊請求的話也就不用使用Adepter了,使用這個是下下策(雖然目前工作需求也是一直改,也會用到),以下簡單示範有事前規劃到的狀況。

 

 

任務 1(改) : 執行請求 

1.建立請求介面

程式碼 : 

    public interface IRequest
    {
        void Request();
    }

 

2.建立一般請求並繼承請求介面

    public class NormalRequest : IRequest
    {
        public void Request()
        {
            Console.WriteLine("Noraml Request.");
        }
    }

 

3.建立特殊請求並繼承請求介面

    public class SpecificRequest : IRequest
    {
        public void Request()
        {
            Console.WriteLine("Specific Request.");
        }
    }

 

4.使用

        static void Main(string[] args)
        {
            IRequest target = new SpecificRequest();
            IRequest target1 = new NormalRequest();
            IRequest target2 = new NormalRequest();

            List<IRequest> targets = new List<IRequest>()
            {
                target,target1,target2
            };

            foreach (var item in targets)
                item.Request();
            Console.ReadLine();
        }

小結 : 

這樣就不需要多建一個Adepter類別,只要建立好不同請求就好,不用再透過Adepter翻譯。

 

 

任務2 : 外籍籃球員加入團隊,教練指揮戰術

1.建立抽象球員

程式碼 : 

    public abstract class Player
    {
        protected string name;
        public Player(string name)
        {
            this.name = name;
        }

        public abstract void Attack();
        public abstract void Defense();

    } 

 

2.建立本國籍中鋒、前鋒、後衛

程式碼 : 

public class Forwards : Player
    {
        public Forwards(string name) : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine($"Forwards {name} 進攻!");
        }

        public override void Defense()
        {
            Console.WriteLine($"Forwards {name} 防守!");
        }
    }
    public class Center : Player
    {
        public Center(string name) : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine($"Center {name} 進攻!");
        }

        public override void Defense()
        {
            Console.WriteLine($"Center {name} 防守!");
        }
    }
    public class Guards : Player
    {
        public Guards(string name) : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine($"Guards {name} 進攻!");
        }

        public override void Defense()
        {
            Console.WriteLine($"Guards {name} 防守!");
        }
    }

 

3.建立外國人中鋒

程式碼 : 

    public class ForeignCenter
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public void AttackABCDE()
        {
            Console.WriteLine($"Foreign {name} 進tmd攻!");
        }

        public void DefenceABCED()
        {
            Console.WriteLine($"Foreing {name} 防tmd守!");
        }
    }

 

4.建立翻譯員

程式碼 : 

public class Translator : Player
    {
        private ForeignCenter foreignCenter = new ForeignCenter();
        public Translator(string name) : base(name)
        {
            foreignCenter.Name = name;
        }

        public override void Attack()
        {
            foreignCenter.AttackABCDE();
        }

        public override void Defense()
        {
            foreignCenter.DefenceABCED();
        }
    }

 

5.教練指揮戰術

        static void Main(string[] args)
        {
            List<Player> players = new List<Player>
            {
                new Forwards("台A"),
                new Center("台B"),
                new Guards("台C"),
                new Translator("外A")
            };

            foreach (var player in players)
            {
                player.Attack();
                player.Defense();
            }
            Console.ReadLine();
        }

說明 : 

外籍球員加入,教練在指揮時是說給翻譯員Translator聽,然後翻譯員再翻譯給外籍球員聽。不過過了N年後外籍球員也懂中文了,翻譯員(Translator)就可以再見,教練(碼農)也可以直接下達戰術(修改程式)了。

 

 

新手上路,若有錯誤請不吝嗇指教,謝謝。