程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 適配器模式(Adepter)

適配器模式(Adepter)

編輯:C#入門知識

 

  適配器模式(Adepter),將一個類的接口轉換成客戶希望的另外一個接口。Adepter模式使得原本由於模式不兼容而不能一起工作的那些類,可以一起工作。       在軟件開發中,當系統的數據和行為都正確,但接口不符時,我們應該考慮用適配器模式,目的是使控制范圍之外的一個原有對象與某個接口匹配,適配器模式主要應用於希望復用一些現存的類,但是接口又與復用環境不一致的情況,比如要在需要對早起代碼復用,一些功能等應用上很有實用價值。       適配器模式UML類圖:        分析:        Target是客戶所期待的接口,目標可以是具體的或抽象的類也可以是接口;Adeptee是需要適配的類;Adepter是適配器類,通過在內部包裝一個Adeptee對象把源接口轉換成目標接口。        適配器模式實現:   [csharp]  using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;      namespace Adepter   {       /*       * 這是客戶所期待的接口,目標可以是具體的或抽象的類也可以是接口       */       class Target       {           public virtual void Request()           {               Console.WriteLine("普通請求...");           }       }       /**       * 需要適配的類       */       class Adeptee       {           public void SpecificRequest()           {               Console.WriteLine("特殊請求...");           }       }          /*       * Adepter通過在內部包裝一個Adeptee對象把源接口轉換成目標接口       */       class Adepter : Target       {           private Adeptee adeptee = new Adeptee();//這是一個私有的Adeptee對象              public override void Request()           {               this.adeptee.SpecificRequest();//這樣就可以把表面調用Request()方法,轉換為調用SpecificRequest()方法               //base.Request();           }       }   }   客戶端:     [csharp]   using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;      namespace Adepter   {       class Program       {           static void Main(string[] args)           {               Target target = new Adepter();               target.Request();//對客戶來說,調用的就是Target的Request()                  Console.Read();           }       }   }          適配器模式總結:           當使用一個已經存在的類,但是它的接口也就是它的方法或你的要求不相同時;兩個類所做的事情相同或者相似但是接口不同時,應該考慮使用適配器模式。這樣客戶可以統一調用一個接口,從而更簡單、更直接、更緊湊。        適配器模式案例—籃球翻譯適配器   [csharp]   using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;      namespace AdepterExample   {       abstract class Player       {           private string name;           public Player(string name)           {               this.name = name;           }           public string getName()           {               return this.name;           }           public void setName(string name)           {               this.name = name;           }              public abstract void Attack();           public abstract void Defense();       }          class Forwards : Player       {           public Forwards(string name):base(name){}           public override void Attack()           {               Console.WriteLine("前鋒{0},進攻!",this.getName());               //throw new NotImplementedException();           }           public override void Defense()           {               Console.WriteLine("前鋒{0},防守!", this.getName());               //throw new NotImplementedException();           }       }          class Center : Player       {           public Center(string name) : base(name) { }           public override void Attack()           {               Console.WriteLine("中鋒{0},進攻!", this.getName());               //throw new NotImplementedException();           }           public override void Defense()           {               Console.WriteLine("中鋒{0},防守!", this.getName());               //throw new NotImplementedException();           }       }             class Guards : Player       {           public Guards(string name) : base(name) { }           public override void Attack()           {               Console.WriteLine("後衛{0},進攻!", this.getName());               //throw new NotImplementedException();           }           public override void Defense()           {               Console.WriteLine("後衛{0},防守!", this.getName());               //throw new NotImplementedException();           }       }          class ForeignCenter       {           private string name;                 public string getName()           {               return this.name;           }           public void setName(string name)           {               this.name = name;           }              public void 進攻()           {               Console.WriteLine("外籍中鋒{0},進攻!", this.name);           }              public void 防守()           {               Console.WriteLine("外籍中鋒{0},防守!",this.name);           }       }       class Adepter : Player       {           private ForeignCenter foreignCenter = new ForeignCenter();              public Adepter(string name) : base(name)            {               foreignCenter.setName(name);           }              public override void Attack()           {               foreignCenter.進攻();                //throw new NotImplementedException();           }           public override void Defense()           {               foreignCenter.防守();               //throw new NotImplementedException();           }          }   }   客戶端:     [csharp]  using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;      namespace AdepterExample   {       class Program       {           static void Main(string[] args)           {               Player p1 = new Forwards("巴蒂爾");               Player p2 = new Adepter("姚明");               Player p3 = new Guards("麥克格雷迪");                  p1.Attack();               p2.Attack();               p3.Attack();               p2.Defense();                  Console.Read();           }       }   }   運行結果:        

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved