IOC 理解总结
IOC的英文名称是Inverse of Control ,可译为控制反转或者控制倒置。
对IOC 有两种理解方式:
第一种:认为Ioc 一种是面向对象的设计模式。
第二种:认为Ioc 跟面向对象没有直接关系,所谓的控制反转就是将应用对流程的控制转移到框架中 ,IOC是设计框架所采用的一种设计原则和思想。
个人偏向于第二种的理解: 控制反转体现的是控制权的转移,即控制权原来在A 手中,现在需要B来接管,可以理解为“针对流程的控制”。IOC几乎是所有框架都具有的一个固有属性。
IOC一方面通过控制流程从应用程序向框架的反转,实现了针对流程自身的重用,另一方面通过内置的扩展机制使这个被重用的流程能够自由的定制。
很多设计模式采用实现了IOC原则:
1. 模板方法设计模式:模板方法设计模式和IOC的意图一致,该模式主要将一个可复用的工作流程或者由多个步骤组成的算法定义成模板方法。
具体操作为:在类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中去实现。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。步骤的实现可以用虚方法或者抽象类等方式。
// 客户端调用 class Client { static void Main(string[] args) { // 创建一个菠菜实例并调用模板方法 Spinach spinach = new Spinach(); spinach.CookVegetabel(); Console.Read(); } } public abstract class Vegetabel { public void CookVegetabel() { Console.WriteLine("抄蔬菜的一般做法"); this.pourOil(); this.HeatOil(); this.pourVegetable(); this.stir_fry(); } // 第一步倒油 public void pourOil() { Console.WriteLine("倒油"); } // 把油烧热 public void HeatOil() { Console.WriteLine("把油烧热"); } // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定 public abstract void pourVegetable(); // 开发翻炒蔬菜 public void stir_fry() { Console.WriteLine("翻炒"); } } // 菠菜 public class Spinach : Vegetabel { public override void pourVegetable() { Console.WriteLine("倒菠菜进锅中"); } } // 大白菜 public class ChineseCabbage : Vegetabel { public override void pourVegetable() { Console.WriteLine("倒大白菜进锅中"); } }
2. 工厂方法设计模式:
3 抽象工厂设计模式:
4 依赖注入: