適配器模式執行個體(C#):
用Adapter模式設計一個仿生機器人:
要求機器人可以類比各種動物行為,在機器人中定義了一系列方法,如機器人叫喊方法cry()、機器人移動方法move()等。如果希望在不修改已有代碼的基礎上使得機器人能夠像狗一樣汪汪叫,像狗一樣快跑,或者像鳥一樣嘰嘰叫,像鳥一樣快快飛,使用適配器模式進行系統設計。
類圖:
說明:此類圖有visual studio 2012 自動產生。由類圖可見,首先實現的一個AnimalAdaptee的類,下面是兩個字類,分別具體實現鳥和狗的Cry和Move方法。Robot是一個抽象類別,具體的Adaptor類實RobotAdaptor類,它申明了一個私人的_myAdaptee欄位,其類型為AnimalAdaptee。
由以上的實現,可以達到適配器模式和橋模式的效果,我們看到Adaptor中也沒有具體的指定需要定製化的Adaptee,而是只維護了一個一類Adaptee的引用,這樣可以使程式設計的可擴充性更強。
原始碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace RobotAdaptor{ //機器人類 abstract public class Robot { abstract public void RobotCry(); abstract public void RobotMove(); abstract public void SetAdaptee(object Value); //這麼申明帶有一個參數的抽象方法。 } //抽象的Adaptee public class AnimalAdaptee { public virtual void Cry() { } public virtual void Move() { } //這個虛擬居然這樣用。。 } //不同種類的動物 //狗 public class DogAdaptee : AnimalAdaptee { public override void Cry() { //base.Cry(); Console.WriteLine("這是狗叫:汪汪汪!"); } public override void Move() { //base.Move(); Console.WriteLine("這是狗跳:跳跳跳!"); } } //鳥 public class BirdAdaptee : AnimalAdaptee { public override void Cry() { //base.Cry(); Console.WriteLine("這是鳥叫:嘰嘰嘰!"); } public override void Move() { //base.Move(); Console.WriteLine("這是鳥飛:快快飛!"); } } //適配器類Adaptor public class RobotAdapptor : Robot { private AnimalAdaptee _myAdaptee; public AnimalAdaptee MyAdaptee { get { return _myAdaptee; } set { _myAdaptee = value; } } public override void SetAdaptee(Object Value) { _myAdaptee = (AnimalAdaptee)Value; } public override void RobotCry() { //throw new NotImplementedException(); if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee(); _myAdaptee.Cry(); } public override void RobotMove() { //throw new NotImplementedException(); if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee(); _myAdaptee.Move(); } } class Program { static void Main(string[] args) { Robot MyRobot = new RobotAdapptor(); AnimalAdaptee dogAdaptee = new DogAdaptee(); MyRobot.SetAdaptee(dogAdaptee); MyRobot.RobotCry(); MyRobot.RobotMove(); //申明為第二種鳥類 AnimalAdaptee birdAdaptee=new BirdAdaptee(); MyRobot.SetAdaptee(birdAdaptee); MyRobot.RobotCry(); MyRobot.RobotMove(); Console.ReadKey(); } }}
結果:
直觀的關係圖: