bsp foo content interface 客户 依赖倒转原则 str 基本
在大话中最重要的两句话是:抽象不应该依赖与细节,细节应该依赖于抽象。还有一句是:针对接口编程,不要对实现编程。
类 A 直接依赖类 B。假如要将类 A 改为依赖 C。则必须通过须要改动类 A 的代码来达成。但假设,类 A 是高级模块,负责业务逻辑;类 B 和类 C 是低层模块。负责主要的源自操作。这样改变 A 会给程序带来不必要的风险。
将类 A 改动为依赖接口 I,类 B 和类 C 各自实现接口 I,类 A 通过接口 I 来与类 B 和 C 发生纤细,则会大大减少改动 A 的几率。
用抽象构建框架。用事先扩展细节,相对于细节的多边性,抽象的东西要稳定的多。
场景:客户去商场买东西。要买水果,买的东西是低层模块,客户是高层模块,它决定了要买什么。
上述这样做是没有问题的。可是假设客户想要买其他的东西呢?这时候,我们可能就会想要在建一个类,让客户依赖它。这时候,就要改动 Client 类和加入一个类了。
- class FoodA //低层的实现
- {
- public string Take()
- {
- return "水果";
- }
- }
- class Client
- {
- public void client(FoodA a)
- {
- Console.WriteLine("我想要");
- Console.WriteLine(a.Take());
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Client client = new Client();
- client.client(new FoodA());
- }
- }
假设我们设计 port,让各种低层模块实现 port。而客户仅仅依赖 port 不即可了。在看第二段代码。
这样是不是科扩展性就非常棒了,当然这是横向扩展,纵向是,我们能够加入另外一个类:销售员,让销售员类依赖接口即可了。
- interface IFood//体现抽象
- {
- string take();
- }
- class FoodA : IFood //让低层的模块实现接口
- {
- public string take()
- {
- return "水果";
- }
- }
- class FoodB : IFood
- {
- public string take()
- {
- return "蔬菜";
- }
- }
- class Client
- {
- public void client(IFood ifood)//高级模块依赖接口
- {
- Console.WriteLine("我想要");
- Console.WriteLine(ifood.take());
- }
- }
- class program
- {
- static void Main(string[] args)
- {
- Client client = new Client();
- client.client(new FoodA());//实现接口
- client.client(new FoodB());
- }
- }
A. 高层模块不应该依赖低层模块。两个都应该依赖抽象。
B. 抽象不应该依赖细节。
细节应该依赖抽象。
大话设计模式之依赖倒转原则
来源: http://www.bubuko.com/infodetail-2133446.html