0

考虑以下代码

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;
    }
}

这是开放/封闭原则吗?即,将大部分责任交给基类,并允许继承类的某些功能责任。

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

干杯

4

2 回答 2

1

您可以通过以不同方式扩展来为不同的数据结构创建新的存储库RepositoryBase<TEntity>,而无需修改RepositoryBase<TEntity>. 这就是开闭原则的核心含义。

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

于 2011-05-26T11:19:10.750 回答
0

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

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

于 2012-04-13T12:57:23.573 回答