考虑以下代码
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吗?即将大部分责任推迟到基类,并允许某些职能责任继承类。
感觉不是这样,所以如果不是开放/封闭原则,那么这是一种什么样的设计模式呢?
干杯
答案 0 :(得分:1)
您可以通过以不同方式扩展RepositoryBase<TEntity>
来为不同的数据结构创建新的存储库,而无需修改RepositoryBase<TEntity>
中的代码。这是开放/封闭原则的核心含义。
也就是说,开放/封闭原则是一般设计原则,而不是设计模式。 Save
和IsValid
方法关系中可见的主要设计模式为Template Method。
答案 1 :(得分:0)
正如您可以在维基百科上阅读的那样,OCP有几个定义。可能主要用于stackoverflow的那个是多态的。我更喜欢受保护的变体旋转,因为理想情况下我们希望设计允许在一个地方进行变化,这不会影响依赖于这些变体的某些(受保护的)类。
在您的示例中,IEntity实现中的变体不会影响使用IEntities的客户端类,前提是您没有客户端和实现之间的直接耦合。也就是说,客户端应该只了解IEntities而不是特定的实现。这通常需要实现工厂,以便客户可以在不具体了解实现的情况下访问实现。