在下面的适配器设计模式示例代码中,为什么引入一个新类而不是在客户端使用多个接口?
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(旧版/外部库/等...),并且您希望将自己的 APIclasses
能够在不更改代码的情况下使用该 API。
假设您使用的 API 具有ISomethingToSerialize
public interface ISomethingToSerialize
{
object[] GetItemsToSerialize();
}
该 API 还有一个Serialize
功能:
public class SerializationServices
{
byte[] Serialize(ISomethingToSerialize objectToSerialize);
}
现在你有一个class
在您的代码中,并且您不想或无法更改它,我们称其为MyUnchangeableClass
.
This 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 的要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)