在下面的适配器设计模式示例代码中,为什么要引入一个新类而不是在客户端使用多个接口(interface)?
interface ITarget
{
List<string> GetProducts();
}
public class VendorAdaptee
{
public List<string> GetListOfProducts()
{
List<string> products = new List<string>();
products.Add("Gaming Consoles");
products.Add("Television");
products.Add("Books");
products.Add("Musical Instruments");
return products;
}
}
class VendorAdapter:ITarget
{
public List<string> GetProducts()
{
VendorAdaptee adaptee = new VendorAdaptee();
return adaptee.GetListOfProducts();
}
}
class ShoppingPortalClient
{
static void Main(string[] args)
{
ITarget adapter = new VendorAdapter();
foreach (string product in adapter.GetProducts())
{
Console.WriteLine(product);
}
Console.ReadLine();
}
}
我有以下与上述代码相关的查询。
- 如果 ShoppingPortalClient 直接继承 VendorAdaptee 呢?
- 在什么情况下我们需要适配器类?
- 为什么不是简单地继承所需的类,而是创建这种模式来访问另一个类的方法?
最佳答案
有时您有一个您无法更改的给定 API(遗留/外部库/等...)并且您想让您的类
能够在不更改的情况下使用该 API他们的代码。
假设您使用的 API 具有 ISomethingToSerialize
public interface ISomethingToSerialize
{
object[] GetItemsToSerialize();
}
该 API 还有一个 Serialize
函数:
public class SerializationServices
{
byte[] Serialize(ISomethingToSerialize objectToSerialize);
}
现在您的代码中有一个类
,您不想或不能更改它,我们将其命名为MyUnchangeableClass
。
这个 class
没有实现 ISomethingToSerialize
但你想使用 API
序列化它所以你创建 AdapterClass
它实现了 ISomethingToSerialize
以允许 MyUnchangeableClass
使用它而不用自己实现它:
public class AdapterClass : ISomethingToSerialize
{
public AdapterClass(MyUnchangeableClass instance)
{
mInstance = instance;
}
MyUnchangeableClass mInstance;
public object[] GetItemsToSerialize()
{
return mInstance.SomeSpecificGetter();
}
}
现在你可以使用
MyUnchangeableClass instance = ... //Constructor or factory or something...
AdapterClass adapter = new AdapterClass(instance)
SerializationServices.Serialize(adapter);
序列化 MyUnchangeableClass
的实例,即使它本身不满足 API 的要求。
关于c# - 适配器设计模式需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188801/