分享:面向接口编程
“面向接口编程”是面向对象编程思想中最重要的一个原则。根据“封装变化”的原理,我们常常将易于变化的部分进行抽象,定义为接口。
对于调用者而言,只需要知道接口的外部定义即可,具体的实现则不用理会。
在设计模式中,Strategy模式就是这样的一个“面向接口编程”的最佳体现,它进行抽象的一部分是针对特定的“算法”,或者说是“策略”。
1.假设我们要开发一个税务系统,那么有关税务的计算就会依照纳税人的不同而分为个人所得税和企业所得税,而这两种税收类型依法应缴纳的税金在计算方式上是迥然不同的两种策略。此时,我们就可以应用策略模式,将税收策略抽象为接口ITaxStrategy:
public interface ITaxStrategy
{
double Calculate(double income);
}
public interface ITaxStrategy
{
double Calculate(double income);
}
2.在对税收计算策略完成了抽象后,就从设计上去除了模块间存在的耦合,消除了变化可能会造成的未来系统的大规模修改,而所谓“面向接口编程”正是基于这样的道理。
定义接口之后,各种税收策略均实现该接口:
public class PeronalTaxStrategy:ITaxStrategy
{
public double Calculate(double income)
{
//实现略;
}
}
public class EnterpriseTaxStrategy:ITaxStrategy
{
public double Calculate(double income)
{
//实现略;
}
}
{
public double Calculate(double income)
{
//实现略;
}
}
public class EnterpriseTaxStrategy:ITaxStrategy
{
public double Calculate(double income)
{
//实现略;
}
}
3.如果此时有一个公共的类,提供税收的相关操作,其中就包括计算所得税的方法:
public class TaxOp
{
private ITaxStrategy m_strategy;
{
private ITaxStrategy m_strategy;
//构造函数,用来实例化这个类
public TaxOp(ITaxStrategy strategy)
{
this.m_strategy = strategy;
}
public double GetTax(double income)
{
return strategy.Calculate(income);
}
}
public TaxOp(ITaxStrategy strategy)
{
this.m_strategy = strategy;
}
public double GetTax(double income)
{
return strategy.Calculate(income);
}
}
在这个类中,接收了一个ITaxStrategy类型的对象,由于该对象是一个接口类型,因此类TaxOp是与具体税收策略无关的,它们之间因为接口的引入而成为了一个弱依赖的关系,如类图所示:
5.
如果客户端要调用有关税收的操作时,就可以根据纳税人的类型具体实例化税收策略对象:
public class App
{
public static void Main(string[] args)
{
TaxOp op = new TaxOp(new PersonalTaxStrategy());
Console.WriteLine(“The Personal Tax is :{0}”, op.GetTax(1000));
}
}
public class App
{
public static void Main(string[] args)
{
TaxOp op = new TaxOp(new PersonalTaxStrategy());
Console.WriteLine(“The Personal Tax is :{0}”, op.GetTax(1000));
}
}