将不确定变为确定~接口应该是什么

接口到底是什么,应该如何去使用它呢?

书上说:“接口规定了一组操作的规范,它将一些不相关的对象联系在一起”,说是这样说,但在实际当中我们应该如何去用接口,如何去用好接口呢?

事实上,我一直认为,在面向对象中,接口就是大哥大,用好接口,理解好接口,你对面向对象的认识也将上升一个新的台阶,接口不可遗忘的功能就是它实现了面向对象的多态性,多态,即一种对象,在接受指定信息时,实现指定的对象实例,这其实就是我对多态的比较直观的理解。

一个用户操作的接口可能是这样被定义:

 1     /// <summary>
 2     /// 用户相关接口规范
 3     /// </summary>
 4     public interface IUserRepository : Data.IRepository<UserBases>
 5     {
 6         /// <summary>
 7         /// 注册流程
 8         /// </summary>
 9         /// <param name="entity"></param>
10         VMessage RegisterUser(UserBases entity);
11
12         void UpdateUser(UserBases entity);
13         /// <summary>
14         /// 登陆
15         /// </summary>
16         /// <param name="entity"></param>
17         /// <returns></returns>
18         VMessage Login(UserBases entity);
19
20         /// <summary>
21         /// 修改密码
22         /// </summary>
23         /// <param name="entity"></param>
24         /// <returns></returns>
25         VMessage ChangePassword(UserBases entity);
26      }

但对于它的实现,我们可以有多种,如可以是sqlserver的,而对于sqlserver来说,又可以是linq to sql的,ado.net的及ef的等等。

而对于一个用户操作的实现类,它将被动的去实现IUserRepository的基接口IRepository,代码如下:

  1   /// <summary>
  2     /// 用户操作实现类
  3     /// sqlserver-linq to sql实现
  4     /// </summary>
  5     public class UserRepository : Car_RentalRepositoryBase, IUserRepository
  6     {
  7
  8         #region IUserRepository 成员
  9
 10         public VMessage RegisterUser(UserBases entity)
 11         {
 12             entity.Password = Utility.EncryptString(entity.Password, Utility.EncryptorType.MD5);
 13             VMessage vm = new VMessage();
 14             try
 15             {
 16                 base.InsertEntity(entity);
 17                 vm.IsComplete = true;
 18             }
 19             catch (Exception)
 20             {
 21                 vm.IsComplete = false;
 22                 throw;
 23             }
 24             return vm;
 25
 26         }
 27
 28         public void UpdateUser(UserBases entity)
 29         {
 30             DB.SubmitChanges();
 31         }
 32
 33         public VMessage Login(UserBases entity)
 34         {
 35             VMessage vm = new VMessage();
 36             try
 37             {
 38                 entity = this.GetModel().Where(i => i.Name == entity.Name && i.Password == Utility.EncryptString(entity.Password, Utility.EncryptorType.MD5)).FirstOrDefault();
 39                 if (entity != null)
 40                 {
 41                     vm.IsComplete = true;
 42                     vm.Entity = entity;
 43                 }
 44                 else
 45                     vm.IsComplete = false;
 46             }
 47             catch (Exception)
 48             {
 49                 vm.IsComplete = false;
 50                 throw;
 51             }
 52             return vm;
 53         }
 54
 55         public VMessage ChangePassword(UserBases entity)
 56         {
 57             VMessage vm = new VMessage();
 58             try
 59             {
 60                 vm = this.Login(entity);
 61
 62                 if (vm.IsComplete)
 63                 {
 64                     entity = vm.Entity as UserBases;
 65                     entity.Password = Utility.EncryptString(entity.NewPassword, Utility.EncryptorType.MD5);
 66                     this.Update(entity);
 67                     vm.IsComplete = true;
 68                 }
 69                 else
 70                     vm.IsComplete = false;
 71             }
 72             catch (Exception)
 73             {
 74                 vm.IsComplete = false;
 75                 throw;
 76             }
 77             return vm;
 78         }
 79         #endregion
 80
 81         #region IRepository<UserBases> 成员
 82
 83         public void Update(UserBases entity)
 84         {
 85             base.UpdateEntity(entity);
 86         }
 87
 88         public void Update(IList<UserBases> list)
 89         {
 90             list.ToList().ForEach(entity => { this.Update(entity); });
 91         }
 92
 93         public void Insert(UserBases entity)
 94         {
 95             base.InsertEntity(entity);
 96         }
 97
 98         public void Insert(IList<UserBases> list)
 99         {
100             list.ToList().ForEach(entity => { this.Insert(entity); });
101         }
102
103         public UserBases InsertGetIDENTITY(UserBases entity)
104         {
105             base.InsertEntity(entity);
106             return base.Find<UserBases>(entity.UserID);
107         }
108
109         public void Delete(UserBases entity)
110         {
111             base.DeleteEntity(entity);
112         }
113
114         public void Delete(IList<UserBases> list)
115         {
116             list.ToList().ForEach(entity => { this.Delete(entity); });
117         }
118
119         public IQueryable<UserBases> GetModel()
120         {
121             return base.GetEntities<UserBases>().Select(item => new UserBases_Ext
122             {
123                 CreateDate = item.CreateDate,
124                 Email = item.Email,
125                 Name = item.Name,
126                 Status = item.Status,
127                 UpdateDate = item.UpdateDate,
128                 UserID = item.UserID,
129                 Password = item.Password,
130                 ConfirmCode = item.ConfirmCode,
131                 ConfirmPassword = item.ConfirmPassword,
132                 IDNumber = item.IDNumber,
133                 IDType = item.IDType,
134                 QQ = item.QQ,
135                 Tel = item.Tel,
136                 TelVerify = item.TelVerify,
137             });
138         }
139
140         public UserBases Find(params object[] keyValues)
141         {
142             return base.Find<UserBases>(keyValues);
143         }
144
145         #endregion
146     }

而在业务层去调用时,你可以使用IOC去建立实例,也可以在程序里写死,但它为业务层开放时,尽量是“构架方法”注入式的,以下是商品业务模块的代码片断:

 1   /// <summary>
 2     /// 商品模块实现
 3     /// </summary>
 4     public class ProductService : ServiceBase, IProductService
 5     {
 6         IProductRepository iProductRepository = null;
 7         /// <summary>
 8         /// 默认构造方法
 9         /// </summary>
10         public ProductService()
11             : this(new ProductRepository())
12         {
13
14         }
15         /// <summary>
16         /// 构造方法,可以在建立实例时进行实现方式的选择
17         /// </summary>
18         /// <param name="_iProductRepository"></param>
19         public ProductService(IProductRepository _iProductRepository)
20         {
21             iProductRepository = _iProductRepo

而这样,在上一层就可以转入接口的一个实现就可以了,这样是否方便TDD呢,呵呵。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~接口应该是什么,如需转载请自行联系原博主。

时间: 2024-10-12 13:25:00

将不确定变为确定~接口应该是什么的相关文章

将不确定变为确定系列~目录(“机器最能证明一切”)

本系列文章主要是我在工作中,遇到一些不能主观判断的问题,最后在电脑上去证明我的理解是否正确,这也是题目"将不确定变成确定"的由来. 记得我在上大学时,老师说过一句话:"机器最能证明一切",这句话现在看来,确实很经典. 将不确定变为确定系列~目录("机器最能证明一切") 第一回 将不确定变成确定~类中的override 第二回 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 第三回 将不确定变成确定~frameset页面不

IP DHCP SNOOPING工作原理测试

一.工作原理: A.在指定VLAN启用DHCP Snooping后,将端口分为Trusted接口和Untrusted接口,默认VLAN所有接口都变为Untrusted接口,需要手动设置Trusted接口. B.对于Untrusted接口,只能接收DHCP的请求消息,不会向这个接口发送出DHCP的请求消息. C.对于Untrusted接口,从接口进入的DHCP的响应消息也会被drop掉 D.对于Trusted接口,没有任何限制,也不做检测. ---测试后觉得这个不确切,Trusted接口如果没有D

retrofit--------样例代码

Retrofit 官网:http://square.github.io/retrofit/  1) POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中.2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类.3) RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器,比如jackson 使用 Retrofit将Re

Android开发者必知的5个开源库

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷.不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库.在这里,向大家介绍的就是,在这个任劳任怨的大家庭中,最受开发者喜爱的五个Android库.希望通过对它们的了解,能够对你的开发工作有所帮助. 1. GSON Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.可用于将Java对象转换成对应的JSON表示,也可以将JSON字符串转换成一个等效的Java对

【Python之旅】第一篇:基于文件处理的登陆接口

1.基本需求     编写登陆接口,实现如下需求: (1)输入用户名密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 2.实现细节 ·每添加一个用户,需要手动添加三个文件 文件 功能 username_count.txt 记录用户输错密码的次数,最大为3次,如果用户密码输入正确,则重置为0,默认为0 username_lock.txt 记录用户是否被锁定,1表示锁定,0表示未锁定,默认为0 username_passwd.txt 记录用户的密码 ·注:username是指该用户的用户名,

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

HBase Thrift接口的常见使用问题和注意事项

HBase对于非Java语言提供了Thrift接口支持,这里结合对HBase Thrift接口(HBase版本为0.92.1)的使用经验,总结其中遇到的一些问题及其相关注意事项. 1. 字节的存放顺序 HBase中,由于row(row key和column family.column qualifier.time stamp)是按照字典序进行排序的,因此,对于short.int.long等类型的数据,通过Bytes.toBytes(-)转换成byte数组后,必须按照大端模式(高字节在低地址,低字

C#中COM操作(二) 接口查询

上一篇末留下的一个疑问这一回来作个解答吧.大家看了下面的图就清楚了: 结论就是t1,t2,t3是三个不同的引用,也就是说在.NET里面代表了三种不同的类型,但是三种类型的GUID却是一样的,因为在COM里GUID代表了一个COM类,只要GUID是一样的那么就表示是一个COM类,因此仅从COM类这一角度出发的话,这三种类型就是同一个COM类型. 第1种方式创建的COM对象的.NET包装的类型一般来说就是COM导入的.NET包装程序集里面对应声明的类型. 第2种方式创建的COM对象的.NET包装的类

主板sata接口不认硬盘怎么办

  主板sata接口不认硬盘的原因及解决方法: 一.硬盘无法使用的故障 1.BIOS设置错误 主要出现在BIOS中有关SATA的设置错误,特别是一些早期的主板使用第三方的SATA/RAID控制芯片,但基本上在BIOS中是被关闭的,所以要使用该硬盘,需要把这个芯片打开. 2.SATA接头故障 这种故障有2种可能: 1)接头松动,现象就是开机听得到硬盘自检声,但在BIOS中不能找到硬盘. 2)接头不干净,现象主要是传输速度慢或出现暂停.碰到这种情况就先要把SATA的接口内的金属性用酒精擦拭干净,然后