【读书学习记录】【设计模式】依赖倒置原则
依赖倒置原则:
1.定义:系统的高层部分不应该直接依赖于系统的底层部分,相反,他们应该依赖于某种抽象
2.优点:可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
3.通过代码去理解(场景-解决方式):
【场景】
namespace ConsoleApp1 { public enum Relationship { Parent, Child, Sibling } public class Person { public String Name { get; set; } } // low-level public class Relationships { private List<(Person, Relationship, Person)> relations = new List<(Person, Relationship, Person)>(); public void AddParentAndChild(Person parent, Person child) { relations.Add((parent, Relationship.Parent, child)); relations.Add((child, Relationship.Child, parent)); } public List<(Person, Relationship, Person)> Relations => relations; } // high-level public class Research { public Research(Relationships relationships) { var relations = relationships.Relations; foreach (var r in relations.Where( x => x.Item1.Name == "John" && x.Item2 == Relationship.Parent)) { Console.WriteLine($"John has a child called {r.Item3.Name}"); } } static void Main(string[] args) { var parent = new Person { Name = "John" }; var child1 = new Person { Name = "Chris" }; var child2 = new Person { Name = "Matt" }; var relationships = new Relationships(); relationships.AddParentAndChild(parent, child1); relationships.AddParentAndChild(parent, child2); new Research(relationships); } } }
违背了依赖倒置原则
【解决方式】
namespace ConsoleApp1 { public enum Relationship { Parent, Child, Sibling } public class Person { public String Name { get; set; } } public interface IRelationshipBrowser { IEnumerable<Person> FindAllChildrenOf(string name); } // low-level public class Relationships: IRelationshipBrowser { private List<(Person, Relationship, Person)> relations = new List<(Person, Relationship, Person)>(); public void AddParentAndChild(Person parent, Person child) { relations.Add((parent, Relationship.Parent, child)); relations.Add((child, Relationship.Child, parent)); } public List<(Person, Relationship, Person)> Relations => relations; public IEnumerable<Person> FindAllChildrenOf(string name) { return relations.Where( x => x.Item1.Name == "John" && x.Item2 == Relationship.Parent).Select(r => r.Item3); } } // high-level public class Research { //public Research(Relationships relationships) //{ // var relations = relationships.Relations; // foreach (var r in relations.Where( // x => x.Item1.Name == "John" && // x.Item2 == Relationship.Parent)) // { // Console.WriteLine($"John has a child called {r.Item3.Name}"); // } //} public Research(IRelationshipBrowser browser) { foreach (var p in browser.FindAllChildrenOf("John")) { Console.WriteLine($"John has a child called {p.Name}"); } } static void Main(string[] args) { var parent = new Person { Name = "John" }; var child1 = new Person { Name = "Chris" }; var child2 = new Person { Name = "Matt" }; var relationships = new Relationships(); relationships.AddParentAndChild(parent, child1); relationships.AddParentAndChild(parent, child2); new Research(relationships); } } }
【对比】

依赖倒置原则实现的是:能够在不改变暴露接口的情况下更改系统内部的能力。

浙公网安备 33010602011771号