【读书学习记录】【设计模式】依赖倒置原则

【读书学习记录】【设计模式】依赖倒置原则

依赖倒置原则:
1.定义:系统的高层部分不应该直接依赖于系统的底层部分,相反,他们应该依赖于某种抽象
2.优点:可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

3.通过代码去理解(场景-解决方式):

【场景】

namespace ConsoleApp1
{public enum Relationship{Parent,Child,Sibling}public class Person{public String Name { get; set; }}// low-levelpublic 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-levelpublic 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-levelpublic 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-levelpublic 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);}}
}

【对比】

image