1.设计原则
1.1 单一职责原则
不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。(代码级别,方法级别,类的级别)
1.2 里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象。(不要重写父类的方法,不使用virtual关键字)
1.3 依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。(多使用抽象类和接口)
1.4 接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。(接口不要包含太多方法)
1.5 迪米特法则
一个对象应该对其他对象保持最少的了解。(只与直接的朋友通信)出现成员变量、方法参数、方法返回值中的类为直接朋友关系,而出现在局部变量中的类则不是直接的朋友关系
1.6 开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
2.类和类之间的关系
组合,聚合,关联,依赖
3.一个功能设计的演变
3.1 组织信息导出
public class OrganizationExcel { public void Export() { using (FileStream fs = new FileStream("d:/1.xlsx", FileMode.OpenOrCreate)) { string[] HeaderNameList = { "组织名称", "所属公司", "组织类型", "组织类别", "党委部室", "支部地址", "书记名" }; IWorkbook workbook = new XSSFWorkbook(); ICellStyle cellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet("sheet1"); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < HeaderNameList.Length; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(HeaderNameList[i]); cell.CellStyle = cellStyle; } for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"组织{i}"); dataRow.CreateCell(1).SetCellValue($"公司{i}"); dataRow.CreateCell(2).SetCellValue($"类型{i}"); dataRow.CreateCell(3).SetCellValue($"类别{i}"); dataRow.CreateCell(4).SetCellValue($"党委部室{i}"); dataRow.CreateCell(5).SetCellValue($"支部地址{i}"); dataRow.CreateCell(6).SetCellValue($"书记名{i}"); } workbook.Write(fs); } } protected ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; return style; } }
3.2 增加对人员的导出
public abstract class BaseExcel { /// <summary> /// 导出 /// </summary> public void Export() { using (FileStream fs = new FileStream("d:/1.xlsx", FileMode.OpenOrCreate)) { IWorkbook workbook = new XSSFWorkbook(); ICellStyle cellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet("sheet1"); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < HeaderNameList.Length; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(HeaderNameList[i]); cell.CellStyle = cellStyle; } SetDataRow(sheet); workbook.Write(fs); } } /// <summary> /// 表头数组 /// </summary> public abstract string[] HeaderNameList { get; } /// <summary> /// 设置每一列的数据值 /// </summary> public abstract Action<ISheet> SetDataRow { get; } protected ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; return style; } }
class OrganizationExcel : BaseExcel { public override string[] HeaderNameList { get { return new string[] { "组织名称", "所属公司", "组织类型", "组织类别", "党委部室", "支部地址", "书记名" }; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"组织{i}"); dataRow.CreateCell(1).SetCellValue($"公司{i}"); dataRow.CreateCell(2).SetCellValue($"类型{i}"); dataRow.CreateCell(3).SetCellValue($"类别{i}"); dataRow.CreateCell(4).SetCellValue($"党委部室{i}"); dataRow.CreateCell(5).SetCellValue($"支部地址{i}"); dataRow.CreateCell(6).SetCellValue($"书记名{i}"); } }; }
class PersonnelExcel : BaseExcel { public override string[] HeaderNameList { get { return new string[] { "人员名", "人员登录名", "人员组织", "人员类型"}; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"人员名{i}"); dataRow.CreateCell(1).SetCellValue($"人员登录名{i}"); dataRow.CreateCell(2).SetCellValue($"人员组织{i}"); dataRow.CreateCell(3).SetCellValue($"人员类型{i}"); } }; }
3.3 增加对责任矩阵的excel导出
public abstract class BaseExcel { /// <summary> /// 导出 /// </summary> public void Export() { using (FileStream fs = new FileStream("d:/1.xlsx", FileMode.OpenOrCreate)) { var workbook = GetWorkBook("sheet1"); workbook.Write(fs); } } protected abstract IWorkbook GetWorkBook(string sheetName); }
public abstract class BaseOrdinaryExcel : BaseExcel { /// <summary> /// 表头数组 /// </summary> public abstract string[] HeaderNameList { get; } /// <summary> /// 设置DataRow /// </summary> public abstract Action<ISheet> SetDataRow { get; } /// <summary> /// 获取excel对象 /// </summary> /// <param name="sheetName">sheet名</param> /// <returns></returns> protected override IWorkbook GetWorkBook(string sheetName) { IWorkbook workbook = new XSSFWorkbook(); ICellStyle cellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < HeaderNameList.Length; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(HeaderNameList[i]); cell.CellStyle = cellStyle; } SetDataRow(sheet); return workbook; } protected ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; return style; } }
class OrganizationExcel : BaseOrdinaryExcel { public override string[] HeaderNameList { get { return new string[] { "组织名称", "所属公司", "组织类型", "组织类别", "党委部室", "支部地址", "书记名" }; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"组织{i}"); dataRow.CreateCell(1).SetCellValue($"公司{i}"); dataRow.CreateCell(2).SetCellValue($"类型{i}"); dataRow.CreateCell(3).SetCellValue($"类别{i}"); dataRow.CreateCell(4).SetCellValue($"党委部室{i}"); dataRow.CreateCell(5).SetCellValue($"支部地址{i}"); dataRow.CreateCell(6).SetCellValue($"书记名{i}"); } }; }
class PersonnelExcel : BaseOrdinaryExcel { public override string[] HeaderNameList { get { return new string[] { "人员名", "人员登录名", "人员组织", "人员类型"}; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"人员名{i}"); dataRow.CreateCell(1).SetCellValue($"人员登录名{i}"); dataRow.CreateCell(2).SetCellValue($"人员组织{i}"); dataRow.CreateCell(3).SetCellValue($"人员类型{i}"); } }; }
public class ResponsibilityTableExcel : BaseExcel { ICellStyle headCellStyle; private const int ORGAN_ROW_NO = 0, //组织行 PERSONNEL_NAME_ROW_NO = 1; //人员名行 protected override IWorkbook GetWorkBook(string sheetName) { IWorkbook workbook = new XSSFWorkbook(); headCellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow organizationRow = sheet.CreateRow(ORGAN_ROW_NO); ICell cell = organizationRow.CreateCell(0); SetHeadValue(cell, "矩阵名"); cell = organizationRow.CreateCell(1); SetHeadValue(cell, "组织名"); sheet.AddMergedRegion(new CellRangeAddress(ORGAN_ROW_NO, ORGAN_ROW_NO, 1, 3)); IRow personnelNameRow = sheet.CreateRow(PERSONNEL_NAME_ROW_NO); for (int i = 1; i < 4; i++) { cell = personnelNameRow.CreateCell(i); SetHeadValue(cell, $"人员{i}"); } sheet.AddMergedRegion(new CellRangeAddress(ORGAN_ROW_NO, PERSONNEL_NAME_ROW_NO, 0, 0)); return workbook; } private void SetHeadValue(ICell cell, string value) { cell.SetCellValue(value); cell.CellStyle = headCellStyle; } private ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.Alignment = HorizontalAlignment.Center; style.VerticalAlignment = VerticalAlignment.Center; return style; } }
3.4 抽象出接口
public interface IExport { void Export(); }
abstract class BaseExcel : IExport { /// <summary> /// 导出 /// </summary> public void Export() { using (FileStream fs = new FileStream("d:/1.xlsx", FileMode.OpenOrCreate)) { var workbook = GetWorkBook("sheet1"); workbook.Write(fs); } } protected abstract IWorkbook GetWorkBook(string sheetName); }
abstract class BaseOrdinaryExcel : BaseExcel { /// <summary> /// 表头数组 /// </summary> public abstract string[] HeaderNameList { get; } /// <summary> /// 设置DataRow /// </summary> public abstract Action<ISheet> SetDataRow { get; } /// <summary> /// 获取excel对象 /// </summary> /// <param name="sheetName">sheet名</param> /// <returns></returns> protected override IWorkbook GetWorkBook(string sheetName) { IWorkbook workbook = new XSSFWorkbook(); ICellStyle cellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < HeaderNameList.Length; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(HeaderNameList[i]); cell.CellStyle = cellStyle; } SetDataRow(sheet); return workbook; } protected ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; return style; } }
class OrganizationExcel : BaseOrdinaryExcel { public override string[] HeaderNameList { get { return new string[] { "组织名称", "所属公司", "组织类型", "组织类别", "党委部室", "支部地址", "书记名" }; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"组织{i}"); dataRow.CreateCell(1).SetCellValue($"公司{i}"); dataRow.CreateCell(2).SetCellValue($"类型{i}"); dataRow.CreateCell(3).SetCellValue($"类别{i}"); dataRow.CreateCell(4).SetCellValue($"党委部室{i}"); dataRow.CreateCell(5).SetCellValue($"支部地址{i}"); dataRow.CreateCell(6).SetCellValue($"书记名{i}"); } }; }
class PersonnelExcel : BaseOrdinaryExcel { public override string[] HeaderNameList { get { return new string[] { "人员名", "人员登录名", "人员组织", "人员类型"}; } } public override Action<ISheet> SetDataRow => (sheet) => { for (int i = 1; i < 10; i++) { IRow dataRow = sheet.CreateRow(i); dataRow.CreateCell(0).SetCellValue($"人员名{i}"); dataRow.CreateCell(1).SetCellValue($"人员登录名{i}"); dataRow.CreateCell(2).SetCellValue($"人员组织{i}"); dataRow.CreateCell(3).SetCellValue($"人员类型{i}"); } }; }
class ResponsibilityTableExcel : BaseExcel { ICellStyle headCellStyle; private const int ORGAN_ROW_NO = 0, //组织行 PERSONNEL_NAME_ROW_NO = 1; //人员名行 protected override IWorkbook GetWorkBook(string sheetName) { IWorkbook workbook = new XSSFWorkbook(); headCellStyle = GetHeadCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow organizationRow = sheet.CreateRow(ORGAN_ROW_NO); ICell cell = organizationRow.CreateCell(0); SetHeadValue(cell, "矩阵名"); cell = organizationRow.CreateCell(1); SetHeadValue(cell, "组织名"); sheet.AddMergedRegion(new CellRangeAddress(ORGAN_ROW_NO, ORGAN_ROW_NO, 1, 3)); IRow personnelNameRow = sheet.CreateRow(PERSONNEL_NAME_ROW_NO); for (int i = 1; i < 4; i++) { cell = personnelNameRow.CreateCell(i); SetHeadValue(cell, $"人员{i}"); } sheet.AddMergedRegion(new CellRangeAddress(ORGAN_ROW_NO, PERSONNEL_NAME_ROW_NO, 0, 0)); return workbook; } private void SetHeadValue(ICell cell, string value) { cell.SetCellValue(value); cell.CellStyle = headCellStyle; } private ICellStyle GetHeadCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.Alignment = HorizontalAlignment.Center; style.VerticalAlignment = VerticalAlignment.Center; return style; } }
class OrganizationTxt : IExport { public void Export() { FileStream fs = new FileStream("d:/1.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); string[] header = new string[] { "组织名称", "所属公司", "组织类型", "组织类别", "党委部室", "支部地址", "书记名" }; sw.WriteLine(string.Join(" ", header)); List<string> list = new List<string>(); for (int i = 1; i < 10; i++) { list.Add($"组织{i}"); list.Add($"公司{i}"); list.Add($"类型{i}"); list.Add($"类别{i}"); list.Add($"党委部室{i}"); list.Add($"支部地址{i}"); list.Add($"书记名{i}"); sw.WriteLine(string.Join(" ", list)); list.Clear(); } sw.Flush(); //关闭流 sw.Close(); fs.Close(); } }
3.5 结论
在这种设计中实现类既可以继承实现YourServiceBase ,也可以直接实现IYourService,提供了很好的灵活性。