我必须访问其中包含“通用”表的旧数据库,而我无权更改它。根据我正在使用的客户数据,表之间的关系可能不同。因此,customerA可以仅通过其客户编号加入订单表,而CustomerB可以按客户编号和日期加入订单表。 CustomerC可能根本不会加入订单表,而是加入另一个表。
所以,我想要做的是为CustomerA创建一个对象图,为CustomerB创建一个对象图,为CustomerC创建一个对象图。我想为每个人创建一个包装类,但一直在研究代理。也就是说,编写有关Proxy类的示例使它们看起来与包装类相同。因此,我的问题是代理类是包装类的同义词。
谢谢。
答案 0 :(得分:3)
基本上,代理是一个看起来与原始对象相同的对象(即实现相同的接口),但是做了更多的事情。
Wrapper是一个看起来与原始对象不同的对象,但通常也是如此。
答案 1 :(得分:2)
有几种方法可以解决手头的问题。
一种是映射到通用域模型。如果您具有相同的基本行为,这可以正常工作,但可能无法很好地为您提供服务(不同类型客户的不同键)。
另一种方法是将公共位向下移动到基类中,然后继承状态(不同属性)或不同行为(仅主键id等)中的不同细节。考虑到这是不同的行为和状态,这是您可以使用的方向。
现在,模式。代理模式是新对象可以提供另一个对象的某些行为和状态但不是对象的模式。可以把它想象成一个人投票给你作为代理的意思,然后把它与软件联系起来。我不认为它像包装器一样,因为包装器通常用于呈现与底层对象不同的面。这可能是由于需要在底层对象中隐藏某些内容或在对象顶部添加更多行为。代理模式对变化的密钥没有帮助;虽然我不相信它是最简单的方法,但是我可以使用包装器。
答案 2 :(得分:1)
来自维基百科:“一个代理,最常见的形式,是一个作为其他东西的接口的类”
代理:是一个“界面”,如果您愿意,它就是一个“黑盒子”,您可以从中请求某些东西并且它可以为您提供所需的内容。
Wrapper:是一个基本上通过封装来隐藏功能的实体,因此通过向调用者公开自己的方法,在其中隐藏“真实”组件/另一个类/ ...包装器的用户不知道它真正工作的对象。
希望这会有所帮助。
问候。
答案 3 :(得分:0)
查看实现,代理和包装类可能非常相似。然而,这些术语通常用于不同的术语。
代理是一个行为与真实对象相似的对象,但不是。相反,它转发所有对真实对象的调用,隐藏了访问远程对象的复杂性。代理对象的一个示例是Visual Studio生成的WCF客户端。客户端将它们称为真实的服务代码,代理处理通信。
包装器是一个对象,由于某种原因隐藏了另一个对象。通常这是在接口不兼容时完成的。具有正确功能但对象错误的对象包含在另一个转换接口的对象中。