这是开放/封闭原则吗?如果不

Posted

技术标签:

【中文标题】这是开放/封闭原则吗?如果不【英文标题】:Is this the Open/Closed principle? And if not 【发布时间】:2011-05-25 19:33:34 【问题描述】:

考虑以下代码

public interface IEntity 
int Id  get; set; 


public class User : IEntity 
    public int Id  get; set; 


public abstract class RepositoryBase<TEntity> where TEntity : IEntity 

    public bool Save(TEntity entity) 
        if (!IsValid(entity)) return false;

        // Write to data store

        return true;
    

    public abstract TEntity CreateNew();

    protected abstract bool IsValid(TEntity entity);



public class UserRepository : RepositoryBase<User> 

    public override User CreateNew() 
        return new User 
            Id = 3
        ;
    

    protected override IsValid(User entity) 
        return entity.Id > 0;
    

这是open/closed principle吗?即将大部分责任交给基类,并允许某些功能责任继承类。

感觉不像,所以如果不是开闭原则,那这是一种什么样的设计模式?

干杯

【问题讨论】:

【参考方案1】:

您可以通过以不同方式扩展RepositoryBase&lt;TEntity&gt;,为不同的数据结构创建新的存储库,而无需修改RepositoryBase&lt;TEntity&gt; 中的代码。这就是开闭原则的核心含义。

也就是说,开放/封闭原则是一般设计原则,而不是设计模式。在SaveIsValid 方法的关系中可见的主要设计模式是Template Method。

【讨论】:

模板法!是的,就是这样。谢谢:-)【参考方案2】:

正如您在***上看到的,OCP 有几个定义。在 *** 上最常使用的一种可能是多态的。我更喜欢受保护的变体旋转,因为理想情况下,我们希望有一种设计允许在一个地方进行变体,这不会影响依赖于这些变体的某些(受保护的)类。

在您的示例中,IEntity 实现的变化不会影响使用 IEntities 的客户端类,前提是您在客户端和实现之间没有直接耦合。也就是说,客户应该只知道 IEntities 而不是具体的实现。这通常需要实现一个工厂,以便客户可以在不具体了解它们的情况下访问实现。

【讨论】:

以上是关于这是开放/封闭原则吗?如果不的主要内容,如果未能解决你的问题,请参考以下文章

装饰器

装饰器函数

单一职责原则开放-封闭原则依赖倒转原则

开放封闭原则:不改代码怎么写新功能?

面向对象原则之一 开放封闭原则(开闭原则)

day21接口类和抽象类,隔离原则,开放封闭原则,多态