首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是Adapter还是Proxy?

这是Adapter还是Proxy?
EN

Stack Overflow用户
提问于 2021-06-15 13:54:26
回答 1查看 52关注 0票数 0

您使用的是具有静态类UserDataAccess的遗留应用程序

代码语言:javascript
复制
public static class UserDataAccess
{
     public static void AddUser(User user) 
     {
        // Insert user into DB
     }
}

它由UserService类使用:

代码语言:javascript
复制
public class UserService 
{
   public bool AddUser(string firstName, string lastName)
   {
      User user = ...
      UserDataAccess.AddUser(user);
   }
}

您需要为UserService类添加单元测试,但是您不能修改UserDataAccess (您不被允许,您没有访问DB的权限)。

一个好的解决方案是创建一个接口并注入到UserService

代码语言:javascript
复制
public interface IUserDataAccess {
     void AddUser(User user);
}

并添加一个将调用委托给静态类的实现:

代码语言:javascript
复制
public class UserDataAccessProxyOrAdapter : IUserDataAccess 
{
   public void AddUser(User user) { 
       UserDataAccess.AddUser(user);
   }
}

我的问题是,这是一个代理还是一个适配器?

Proxy应该添加一些功能。对静态资源的访问可以被视为一种功能吗?

它看起来像一个适配器,因为它使UserDataAccess适合于通过IUserDataAccess接口调用

正确的推理是什么?为什么?

编辑:这来自这个重构测试,特别是在这一步:https://youtu.be/U3QvTaw224o?t=944

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 20:41:09

这既不是Adapter,也不是Proxy设计模式。

Adapter很容易被删除,因为Adapter的API与它所适配的对象的API不同。IUserDataAccessUserDataAccess共享相同的接口:AddUser(User user),它排除了适配器模式。

由于OP中提到的原因,Proxy可以被取消:除了从UserDataAccessProxyOrAdapterUserDataAccess的直接直通之外,什么也没有。不需要远程调用,不需要延迟实例化成本,不需要访问控制,也不需要额外的操作。

我们不想将这个简单的示例称为代理设计模式,因为这意味着每个组合都是一个代理,这将使模式完全贬值。

但是,请注意,proxy也是一个常见的英语单词;因此,尽管将此示例命名为代理设计模式没有任何意义,但根据更广泛的字典定义将其称为代理可能是有效的。我不确定这是否是作者的意图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67980731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档