面向接口编程
下面根据著名的Petshop4.0的一个简单面向对象设计片段为例,来诠释面向接口编程的奥秘。
如图所示,通过接口将增删改查封装起来,再由具体的MySQLUser、AccessUser、XMLUser来实现,Helper类提供操作数据的通用方法。基于接口的数据访问层和具体的数据操作实现彻底分离,对数据的操作规则的变更不会影响实体类对象的行为,体现了职责分离的设计原则,而这种机制是通过接口来完成的。
同时,能够以IUser接口来统一处理用户操作,例如在具体的实例创建时,可以借助反射机制,通过依赖注入来设计实现:
public sealed class DataAccessFactory
{
private static readonly string assemblyPath = ConfigurationManager.AppSettings ["AssemblyPath
"];
private static readonly string accessPath = ConfigurationManager.AppSettings ["AccessPath"];
public static IUser CreateUser()
{
string className = accessPath + ".User";
return (IUser)Assembly.Load(assemblyPath).CreateInstance(className);
}
}
通过抽象可以将未知的对象表现出来,通过读取配置文件的相关信息可以很容易创建具体的对象,当有新的类型增加是只需要在配置文件中增加相应的类型全路径即可。再一次体系拿了:对修改封闭对扩展开放。基于这种设计形成了数据访问层、业务逻辑层、表现层三层架构的良好设计。
业务逻辑层,只有实体对象的相互操作,不必关心具体的数据库操作实现:
public class BLL
{
private static readonly IUser user = DataAccessFactory.CreateUser();
private static User userInfo = new User();
public static void HandleUserInfo(string ID)
{
userInfo = user.GetUser(ID);
//对 userInfo 实体对象进行操作 }
}
接口规则
1、接口隔离原则,强调接口应该被实现为具有单一功能的小接口,而不是具有多个功能的胖接口,类对于类的愿意来应该建立在最小接口之上。
2、接口支持多继承,可以作为值类型,也可以作为引用类型。
3、禁止为已发布的接口添加新成员。这意味着必须重新修改所有实现了该接口的类型。
4、接口不能被实例化,没有沟槽函数,接口成员被隐式声明为public。
5、接口可以用作于值类型、引用类型,并且支持多继承。