面向对象思想的头脑风暴(三)-使用接口进行解耦
接口有一个非常重要的功能就是解除耦合,我们这里使用一个简单的代码发展过程来帮大家理解接口的这个功能。
首先我们先写一段简单的代码
代码
class Employee
{
public string Name { get; set; }
public int Sex { get; set; }
}
static void Main(string[] args)
{
Employee employee = new Employee() { Name = "lfm", Sex = 1 };
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
{
public string Name { get; set; }
public int Sex { get; set; }
}
static void Main(string[] args)
{
Employee employee = new Employee() { Name = "lfm", Sex = 1 };
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
结果为:姓名:lfm,性别:1
我们认为Main函数是界面端,而Employee类是业务逻辑端,简单的代码这样写看起来问题不大,基本可以符合功能要求。
但是假如界面端程序员觉得性别不应该是0,1整数类型,而应该是一个枚举,因为枚举可以更直观,而且有智能感知帮助录入,显然界面端程序员的要求是合理的,但问题是如果业务层是用Linq to sql生成的,而且数据库中就是使用整型存储的,同时底层程序员也不想对数据库进行修改,这时我们可以使用如下方式解决:
代码
enum SexEnum
{
男,
女
}
interface IEmployee
{
string Name { get; set; }
SexEnum Sex { get; set; }
}
partial class Employee
{
public string Name { get; set; }
public int Sex { get; set; }
}
partial class Employee : IEmployee
{
SexEnum IEmployee.Sex
{
get
{
return (SexEnum)this.Sex;
}
set
{
this.Sex=(int)value;
}
}
}
//客户端程序
class Program
{
static void Main(string[] args)
{
IEmployee employee = Factory("lfm",SexEnum.男);
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
static IEmployee Factory(string name, SexEnum sex)
{
return new Employee() { Name = name, Sex = (int)sex };
}
}
{
男,
女
}
interface IEmployee
{
string Name { get; set; }
SexEnum Sex { get; set; }
}
partial class Employee
{
public string Name { get; set; }
public int Sex { get; set; }
}
partial class Employee : IEmployee
{
SexEnum IEmployee.Sex
{
get
{
return (SexEnum)this.Sex;
}
set
{
this.Sex=(int)value;
}
}
}
//客户端程序
class Program
{
static void Main(string[] args)
{
IEmployee employee = Factory("lfm",SexEnum.男);
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
static IEmployee Factory(string name, SexEnum sex)
{
return new Employee() { Name = name, Sex = (int)sex };
}
}
类结构图如下:
这样就使用接口成功的将界面层和业务层分隔开来做到了业务层和界面层的解耦。同时这样还给我们带来了一个额外的好处,那就是当业务层修改的时候不会影响界面层代码,比方说当数据库中的name改成了EmployeeName,界面端程序员觉得这个更改不合理,所以界面端不想修改,我们可以做如下修改:
代码
partial class Employee : IEmployee
{
SexEnum IEmployee.Sex
{
get
{
return (SexEnum)this.Sex;
}
set
{
this.Sex=(int)value;
}
}
public string Name
{
get
{
return this.EmployeeName;
}
set
{
this.EmployeeName=value;
}
}
}
partial class Employee
{
public string EmployeeName { get; set; }
public int Sex { get; set; }
}
{
SexEnum IEmployee.Sex
{
get
{
return (SexEnum)this.Sex;
}
set
{
this.Sex=(int)value;
}
}
public string Name
{
get
{
return this.EmployeeName;
}
set
{
this.EmployeeName=value;
}
}
}
partial class Employee
{
public string EmployeeName { get; set; }
public int Sex { get; set; }
}
而前端不用做任何修改。
需求进一步修改:员工表需要存储在数据库中分成两张表,Employee1,Employee2,名字字段在Employee1中,性别字段在Employee2中,修改代码如下:
代码
class Employee1
{
public string Name { get; set; }
}
class Employee2
{
public int Sex { get; set; }
}
enum SexEnum
{
男,
女
}
interface IEmployee
{
string Name { get; set; }
SexEnum Sex { get; set; }
}
class Employee : IEmployee
{
Employee1 emp1 = new Employee1();
Employee2 emp2 = new Employee2();
public string Name
{
get
{
return emp1.Name;
}
set
{
emp1.Name=value;
}
}
public SexEnum Sex
{
get
{
return (SexEnum)emp2.Sex;
}
set
{
emp2.Sex=(int)value;
}
}
}
class Program
{
static void Main(string[] args)
{
IEmployee employee = Factory("lfm",SexEnum.男);
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
static IEmployee Factory(string name, SexEnum sex)
{
return new Employee() { Name = name, Sex = sex };
}
}
{
public string Name { get; set; }
}
class Employee2
{
public int Sex { get; set; }
}
enum SexEnum
{
男,
女
}
interface IEmployee
{
string Name { get; set; }
SexEnum Sex { get; set; }
}
class Employee : IEmployee
{
Employee1 emp1 = new Employee1();
Employee2 emp2 = new Employee2();
public string Name
{
get
{
return emp1.Name;
}
set
{
emp1.Name=value;
}
}
public SexEnum Sex
{
get
{
return (SexEnum)emp2.Sex;
}
set
{
emp2.Sex=(int)value;
}
}
}
class Program
{
static void Main(string[] args)
{
IEmployee employee = Factory("lfm",SexEnum.男);
Console.WriteLine("姓名:{0},性别:{1}",employee.Name,employee.Sex);
}
static IEmployee Factory(string name, SexEnum sex)
{
return new Employee() { Name = name, Sex = sex };
}
}
类结构图如下:
除了工厂稍微做一点修改外,前端不用更改任何代码。
其实这里的例子基本算是适配器模式的一种应用。
作者:Lance
出处:http://www.cnblogs.com/nuaalfm/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。