zoukankan      html  css  js  c++  java
  • C# 抽象类和接口的使用

    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;
            }
        }
    View Code

    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;
            }
        }
    View Code
    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}");
                    }
                };
        }
    View Code
    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}");
                    }
                };
        }
    View Code

    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);
        }
    View Code
    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;
            }
    
        }
    View Code
    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}");
                    }
                };
        }
    View Code
    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}");
                    }
                };
        }
    View Code
    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;
            }
        }
    View Code

    3.4 抽象出接口

    public interface IExport
        {
            void Export();
        }
    View Code
        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);
        }
    View Code
    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;
            }
    
        }
    View Code
     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}");
                    }
                };
        }
    View Code
        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}");
                    }
                };
        }
    View Code
    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;
            }
        }
    View Code
    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();
            }
        }
    View Code

    3.5 结论

    在这种设计中实现类既可以继承实现YourServiceBase ,也可以直接实现IYourService,提供了很好的灵活性。

  • 相关阅读:
    hibernate更新
    让hibernate支持mysql的text或者longtext
    hibernate的查询
    微博获取原图时重定向到图片的url
    java判断字符串编码
    爬取微博存入数据库时出错
    循环监听事件出错,只能监听最后一个
    org.hibernate.AssertionFailure: null id don't flus
    eclipse有时候导入了包,但是还是有红线,找不到
    hibernate注解创建表总是失败,显示表不存在
  • 原文地址:https://www.cnblogs.com/gamov/p/11136950.html
Copyright © 2011-2022 走看看