这是适配器还是代理?
Is this an Adapter or a Proxy?
您在使用具有静态 class UserDataAccess
:
的旧版应用程序
public static class UserDataAccess
{
public static void AddUser(User user)
{
// Insert user into DB
}
}
被 UserService
class:
使用
public class UserService
{
public bool AddUser(string firstName, string lastName)
{
User user = ...
UserDataAccess.AddUser(user);
}
}
您需要为 UserService
class 添加单元测试,但您不能修改 UserDataAccess
(您不被允许,您无权访问数据库)。
一个好的解决方案是创建一个接口并注入 UserService
:
public interface IUserDataAccess {
void AddUser(User user);
}
并添加一个将调用委托给静态 class:
的实现
public class UserDataAccessProxyOrAdapter : IUserDataAccess
{
public void AddUser(User user) {
UserDataAccess.AddUser(user);
}
}
我的问题是,这是代理还是适配器?
代理应该添加一些功能。访问静态资源可以算作功能吗?
它看起来像一个适配器,因为它适配了通过IUserDataAccess接口调用的UserDataAccess
正确的推理是什么?为什么?
编辑:这是来自这个重构测试,特别是在这一步:https://youtu.be/U3QvTaw224o?t=944
这既不是适配器也不是代理设计模式。
Adapter 很容易被忽略,因为 Adapter 的 API 与它所适配的对象的 API 不同。 IUserDataAccess
和 UserDataAccess
共享相同的 API:AddUser(User user)
,这排除了 Adapter 模式。
Proxy 可以因为 OP 中提到的原因而被取消:除了从 UserDataAccessProxyOrAdapter
到 UserDataAccess
的直接直通之外别无他法。没有远程调用,没有延迟实例化成本,没有访问控制,根本没有采取额外的行动。
我们不想将这个简单的示例称为代理设计模式,因为这意味着每个组合都是代理,这会完全贬低该模式。
但是,请注意,proxy 也是一个通用的英文单词;因此,虽然将此示例命名为代理设计模式没有意义,但根据更广泛的字典定义将其称为代理可能是有效的。我不确定这是否是作者的意图。
您在使用具有静态 class UserDataAccess
:
public static class UserDataAccess
{
public static void AddUser(User user)
{
// Insert user into DB
}
}
被 UserService
class:
public class UserService
{
public bool AddUser(string firstName, string lastName)
{
User user = ...
UserDataAccess.AddUser(user);
}
}
您需要为 UserService
class 添加单元测试,但您不能修改 UserDataAccess
(您不被允许,您无权访问数据库)。
一个好的解决方案是创建一个接口并注入 UserService
:
public interface IUserDataAccess {
void AddUser(User user);
}
并添加一个将调用委托给静态 class:
的实现public class UserDataAccessProxyOrAdapter : IUserDataAccess
{
public void AddUser(User user) {
UserDataAccess.AddUser(user);
}
}
我的问题是,这是代理还是适配器?
代理应该添加一些功能。访问静态资源可以算作功能吗?
它看起来像一个适配器,因为它适配了通过IUserDataAccess接口调用的UserDataAccess
正确的推理是什么?为什么?
编辑:这是来自这个重构测试,特别是在这一步:https://youtu.be/U3QvTaw224o?t=944
这既不是适配器也不是代理设计模式。
Adapter 很容易被忽略,因为 Adapter 的 API 与它所适配的对象的 API 不同。 IUserDataAccess
和 UserDataAccess
共享相同的 API:AddUser(User user)
,这排除了 Adapter 模式。
Proxy 可以因为 OP 中提到的原因而被取消:除了从 UserDataAccessProxyOrAdapter
到 UserDataAccess
的直接直通之外别无他法。没有远程调用,没有延迟实例化成本,没有访问控制,根本没有采取额外的行动。
我们不想将这个简单的示例称为代理设计模式,因为这意味着每个组合都是代理,这会完全贬低该模式。
但是,请注意,proxy 也是一个通用的英文单词;因此,虽然将此示例命名为代理设计模式没有意义,但根据更广泛的字典定义将其称为代理可能是有效的。我不确定这是否是作者的意图。