所以我正在研究适配器设计模式。我看到的目的是允许客户端访问其接口不兼容的类的方法。
现在我正在看this example。
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 ,但由于界面不兼容而无法使用。这是我的愚蠢问题...为什么ShoppingPortalClient无法做到这一点?
var adaptee = new VendorAdaptee();
答案 0 :(得分:2)
该示例实际上没有任何意义。没有必要在ShoppingPortalClient
中使用适配器,因为该类不需要使用ITarget
接口。
如果必须在某个地方传递ITarget
,例如,如果必须在不同的类中调用performSomeOperation(ITarget)
,则然后创建一个适配器来通过。
答案 1 :(得分:1)
ShoppingPortalClient
无法直接使用适配器,因为适配器的界面不是ITarget
(它期望的)。换句话说,VendorAdaptee
不没有GetProducts()
方法,而有GetListOfProducts()
方法。这些是不同的接口。这不适用于ShoppingPortalClient
使用的现有库存管理系统。
答案 2 :(得分:0)
在示例中,主要方法(客户端或用户)正在处理类类型ITarget 。
主要方法不了解VendorAdaptee。
因此main方法将调用GetProducts()来获取数据。但是在我们的课堂上,我们没有它,因此无法使用它。
这是why Adapter design pattern is used。转换后,它需要类并提供为预期的格式。适配器模式也称为包装器。
将VendorAdaptee转换为ITarget并实现GetProducts()之后,我们可以使用代码。
有关更多详细信息,请访问Adapter design pattern in Java或Software development design patterns