设计模式原则--单一职责原则
单一职责原则(SRP)
定义:就一个类而言,应该仅有一个引起它变化的原因
场景: 一个公司有3类员工,分别是 主管,程序员,销售
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 设计模式原则.单一职责 { public class Employee { //程序员写代码 public string Coding() { return "程序员写代码"; } //销售打电话 public string Calling() { return "销售打电话"; } //主管叼烟 public string Smoking() { return "主管叼烟"; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 设计模式原则.单一职责; namespace 设计模式原则 { class Program { static void Main(string[] args) { Console.WriteLine("上班了....."); Employee emp = new Employee(); Console.WriteLine(emp.Calling()); Console.WriteLine(emp.Coding()); Console.WriteLine(emp.Smoking()); Console.Read(); } } }
这时变化来了主管需要叫人加班
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 设计模式原则.单一职责 { public class Employee { //程序员写代码 public string Coding() { return "程序员写代码"; } //销售打电话 public string Calling() { return "销售打电话"; } //主管叼烟 public string Smoking() { return "主管叼烟"; } //变化 突发情况 主管要使唤人了 //程序员加班写代码 public string CoderWorkOvertime() { return "程序员加班" + Coding(); } //销售加班打电话 public string SellerWorkOvertime() { return "销售加班" + Calling(); } //.....等等 } }
这样就会发现Employee类 在主管,销售,程序员都会引起这个类发生变化,一旦发生变化方法就会增加,类就需要修改,当代码量多时,维护困难
这时就需要分类,把Employee的职责分离
程序员:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 设计模式原则.单一职责 { public class CoderEmployee { //程序员写代码 public string Coding() { return "程序员写代码"; } } }
销售:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 设计模式原则.单一职责 { public class SellerEmployee { //销售打电话 public string Calling() { return "销售打电话"; } } }
主管:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 设计模式原则.单一职责 { public class HeaderEmployee { //主管叼烟 public string Smoking() { return "主管叼烟"; } //变化 突发情况 主管要使唤人了 //程序员加班写代码 public string CoderWorkOvertime(CoderEmployee coder) { return "程序员加班" + coder.Coding(); } //销售加班打电话 public string SellerWorkOvertime(SellerEmployee seller) { return "销售加班" + seller.Calling(); } } }
分类过后 Employee职责被分离。主管,销售,程序员 都只关心自身的职责。如果还需要添加职责的话只需要在对应的类里添加对应的职责。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 设计模式原则.单一职责; namespace 设计模式原则 { class Program { static void Main(string[] args) { Console.WriteLine("上班了....."); HeaderEmployee header = new HeaderEmployee(); SellerEmployee seller = new SellerEmployee(); CoderEmployee coder = new CoderEmployee();
Console.WriteLine(seller.Calling()); //销售打电话 Console.WriteLine(coder.Coding());//程序员写代码 Console.WriteLine(header.Smoking());//主管叼烟; Console.WriteLine(header.CoderWorkOvertime(coder)); Console.WriteLine(header.SellerWorkOvertime(seller)); Console.Read(); } } }