配接器概念&範例
任務 : 執行請求
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();
}
說明 :
- 建立特殊請求target
- 建立一般請求target1
- 建立一般請求target2
- 組成請求列表
- 呼叫所有請求
小結 :
這個案例的狀況是在平凡的一般請求中來一個程咬金特殊請求,為了配合他硬是加了一個硬是修改原來的方法改成特殊方法,不過一開始有規劃到這個特殊請求的話也就不用使用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)就可以再見,教練(碼農)也可以直接下達戰術(修改程式)了。
新手上路,若有錯誤請不吝嗇指教,謝謝。