程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#設計形式編程中應用適配器形式構造實戰練習訓練

C#設計形式編程中應用適配器形式構造實戰練習訓練

編輯:C#入門知識

C#設計形式編程中應用適配器形式構造實戰練習訓練。本站提示廣大學習愛好者:(C#設計形式編程中應用適配器形式構造實戰練習訓練)文章只能為提供參考,不一定能成為您想要的結果。以下是C#設計形式編程中應用適配器形式構造實戰練習訓練正文


 在現實的軟件體系設計和開辟中,為了完成某項任務須要購置一個第三方的庫來加速開辟。這帶來一個成績,在運用法式中曾經設計好的功效接口,與這個第三方供給的接口紛歧致。為了使得這些接口不兼容的類可以在一路任務,適配器形式供給了一種接口的適配機制。


  適配器形式的設計思惟在生涯中常常會運用到,如我們在給手機充電的時刻,弗成能直接在220V電源上直接充電,而是用手機充電器轉換成手機須要的電壓才可以正常充電,不然就弗成以完成充電,這個充電器就起到了適配的感化。

適配器形式構造完成

1.類適配器構造完成

2016217155956456.png (367×596)

ITarget.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
 public interface ITarget
 {
  void Request();
 }
}  Adaptee.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
 public class Adaptee
 {
  public void SpecificRequest()
  {
   Console.WriteLine("Called SpecificRequest()");
  }
 }
}  Adapter.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
 public class Adapter : Adaptee, ITarget
 {
  public void Request()
  {
   this.SpecificRequest();
  }
 }
}  Client.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
 public class Client
 {
  static void Main(string[] args)
  {
   ITarget t = new Adapter();
   t.Request();
  }
 }
}  

運轉輸入:

Called SpecificRequest()
請按隨意率性鍵持續. . .

2.對象適配器構造完成

  Client須要挪用Request辦法,而Adaptee並沒有該辦法,為了使Client可以或許應用Adaptee類,須要供給一個類Adapter。這個類包括了一個Adaptee的實例,將Client與Adaptee連接起來。

ITarget.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
 public interface ITarget
 {
  void Request();
 }
}  

Target.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
 public class Target : ITarget
 {
  public virtual void Request()
  {
   Console.WriteLine("Called Target Request()");
  }
 }
}  

Adaptee.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
 public class Adaptee
 {
  public void SpecificRequest()
  {
   Console.WriteLine("Called SpecificRequest()");
  }
 }
} 

 Adapter.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
 public class Adapter : Target
 {
  private Adaptee _adaptee = new Adaptee();

  public override void Request()
  {
   _adaptee.SpecificRequest();
  }
 }
} 

 Client.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
 public class Client
 {
  static void Main(string[] args)
  {
   ITarget t = new Adapter();
   t.Request();
  }
 }
}


適配器形式理論運用

以手機充電的電源適配器為例,用適配器形式的處理計劃。

2016217160138027.png (367×596)

1.類適配器構造完成
ITarget.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
 public interface ITarget
 {
  void GetPower();
 }
}  Power.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
 public class Power
 {
  public void GetPower220V()
  {
   Console.WriteLine("從電源中獲得220V的電壓");
  }
 }
}  Adapter.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
 public class Adapter : Power, ITarget
 {
  public void GetPower()
  {
   this.GetPower220V();
   Console.WriteLine("獲得手機的充電電壓!");
  }
 }
}  Client.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
 public class Client
 {
  static void Main(string[] args)
  {
   Console.WriteLine("手機:");
   ITarget t = new Adapter();
   t.GetPower();
  }
 }
}  

運轉輸入:

手機:
從電源中獲得220V的電壓
獲得手機的充電電壓!
請按隨意率性鍵持續. . .

2.對象適配器構造完成
ITarget.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
 public interface ITarget
 {
  void GetPower();
 }
} 

 Power.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
 public class Power
 {
  public void GetPower220V()
  {
   Console.WriteLine("從電源中獲得220V的電壓");
  }
 }
} 

 Adapter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
 public class Adapter : ITarget
 {
  public Power _power;
  public Adapter(Power power)
  {
   this._power = power;
  }

  /// <summary>
  /// 獲得想要的電壓
  /// </summary>
  public void GetPower()
  {
   _power.GetPower220V();
   Console.WriteLine("獲得手機的充電電壓!");
  }
 }
} 

 Client.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
 public class Client
 {
  static void Main(string[] args)
  {
   Console.WriteLine("手機:");
   ITarget t = new Adapter(new Power());
   t.GetPower();
  }
 }
}

適配器形式的優缺陷
在引言部門曾經提出,適配器形式用來處理現有對象與客戶端等待接口紛歧致的成績,上面具體總結下適配器兩種情勢的優缺陷。
1.類的適配器形式:
長處:
可以在不修正原有代碼的基本下去復用現有類,很好地相符 “開閉准繩”
可以從新界說Adaptee(被適配的類)的部門行動,由於在類適配器形式中,Adapter是Adaptee的子類
僅僅引入一個對象,其實不須要額定的字段來援用Adaptee實例(這個等於長處也是缺陷)。
缺陷:
用一個詳細的Adapter類對Adaptee和Target停止婚配,當假如想要婚配一個類和一切它的子類時,類的適配器形式就不克不及勝任了。由於類的適配器形式中沒有引入Adaptee的實例,光挪用this.SpecificRequest辦法其實不能去挪用它對應子類的SpecificRequest辦法。
采取了 “多繼續”的完成方法,帶來了不良的高耦合。
2.對象的適配器形式
長處:
可以在不修正原有代碼的基本下去復用現有類,很好地相符 “開閉准繩”(這點是兩種完成方法都具有的)
采取 “對象組合”的方法,更相符松耦合。
缺陷:
使得重界說Adaptee的行動較艱苦,這就須要生成Adaptee的子類而且使得Adapter援用這個子類而不是援用Adaptee自己。

應用場景
在以下情形下可以斟酌應用適配器形式:
體系須要復用現有類,而該類的接口不相符體系的需求
想要樹立一個可反復應用的類,用於與一些彼此之間沒有太年夜聯系關系的一些類,包含一些能夠在未來引進的類一路任務。
關於對象適配器形式,在設計裡須要轉變多個已有子類的接口,假如應用類的適配器形式,就要針對每個子類做一個適配器,而這不太現實。

.NET中適配器形式的完成
1.適配器形式在.NET Framework中的一個最年夜的運用就是COM Interop。COM Interop就似乎是COM和.NET之間的一座橋梁(關於COM互操作更多內容可以參考我的互操作系列)。COM組件對象與.NET類對象是完整分歧的,但為了使.NET法式像應用.NET對象一樣應用COM組件,微軟在處置方法上采取了Adapter形式,對COM對象停止包裝,這個包裝類就是RCW(Runtime Callable Wrapper)。RCW現實上是runtime生成的一個.NET類,它包裝了COM組件的辦法,並外部完成對COM組件的挪用。以下圖所示:

2016217160319899.png (784×333)

2..NET中的別的一個適配器形式的運用就是DataAdapter。ADO.NET為同一的數據拜訪供給了多個接口和基類,個中最主要的接口之一是IdataAdapter。DataAdpter起到了數據庫到DataSet橋接器的感化,使運用法式的數據操作同一到DataSet上,而與詳細的數據庫類型有關。乃至可以針對特別的數據源編制本身的DataAdpter,從而使我們的運用法式與這些特別的數據源相兼容。

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