在MVP模式中,通过接口向视图暴露对象而非单独设置控件属性是否合规?
在MVP模式中暴露业务对象给视图的可行性
当然可以!在MVP模式里,通过接口给视图暴露完整的业务对象(就像你定义的TCustomer),而非逐个给控件单独设置属性,不仅完全允许,很多时候还是更靠谱的实践方案。
为什么这种方式更合适?
- 简化交互逻辑:不用写一堆重复的
SetFirstName、SetLastName、SetEmail方法,Presenter只需要把填充好的Customer对象传递给视图,视图自己负责把对象属性映射到对应控件上。这样代码更简洁,后续维护起来也少了很多重复修改的工作。 - 符合MVP的核心原则:MVP要求视图只做展示、不处理业务逻辑。暴露对象后,视图仅仅是把数据“填”到UI控件里,不会涉及任何业务规则判断,依然保持了视图的被动性。
- 提升可扩展性:如果后续
TCustomer需要新增属性(比如PhoneNumber),你只需要在视图里新增对应的控件映射,不用修改Presenter和视图接口的方法签名,大大减少了代码改动的范围。
需要注意的细节
- 控制对象的可修改性:为了避免视图直接修改对象状态破坏MVP的单向数据流,最好给视图暴露只读版本的对象。比如你可以把
TCustomer的Let属性私有化,只允许Presenter修改对象,视图拿到的是只能读取属性的实例。 - 明确视图接口定义:建议定义专门的视图接口(比如
ICustomerView),里面包含Sub SetCustomer(cust As TCustomer)这类方法,Presenter和视图的交互完全通过接口进行,符合依赖倒置原则,也让代码结构更清晰。
结合你的代码示例调整
' 业务层可修改的Customer类(Presenter专用) Private this As TCustomer Private Type TCustomer FirstName As String LastName As String Email As String End Type Public Property Get FirstName() As String FirstName = this.FirstName End Property Private Property Let FirstName(ByVal Value As String) this.FirstName = Value End Property ' 其他属性的Get保留公开,Let设为私有... ' 视图接口(暴露只读对象) Public Interface ICustomerView Sub SetCustomer(cust As TCustomer) ' 如果需要收集用户输入,可以新增方法返回输入的对象 Function GetCustomerInput() As TCustomer End Interface
内容的提问来源于stack exchange,提问作者Kostas K.
相关产品推荐
相关产品推荐

