[S] Single Responsibility Principle (单一职责原则)

认为一个对象应该仅只有一个单一的职责

namespace SingleResponsibilityPrinciple
{class DataAccess{void InsertData(){Console.WriteLine("数据插入成功");}// 错误的设计,不符合 单一职责原则//void WriteLog()//{//    Console.WriteLine("日志插入成功");//}
    }// 应该把不同的职责交给不同的对象处理class Logger{void WriteLog(){Console.WriteLine("日志插入成功");}}
}

SingleResponsibilityPrinciple

[o] Open Close Principle (开闭原则)

认为软件应该是对扩展开放的,而对修改是关闭的

namespace OpenClosePrinciple
{abstract class DataProvider{public abstract void OpenConnection();public abstract void CloseConnection();public abstract void ExecuteCommand();}// MS SQLclass SqlDataProvider:DataProvider{public override void OpenConnection(){Console.WriteLine("打开Sql数据连接");}public override void CloseConnection(){Console.WriteLine("关闭Sql数据连接");}public override void ExecuteCommand(){Console.WriteLine("执行Sql数据命令");}}// ORACLEclass OracleDataProvider:DataProvider{public override void OpenConnection(){Console.WriteLine("打开Oracle数据连接");}public override void CloseConnection(){Console.WriteLine("关闭Oracle数据连接");}public override void ExecuteCommand(){Console.WriteLine("执行Oracle数据命令");}}class Start{void Invoke(){DataProvider dataProvider = new SqlDataProvider();dataProvider.OpenConnection();dataProvider.ExecuteCommand();dataProvider.CloseConnection();dataProvider = new OracleDataProvider();dataProvider.OpenConnection();dataProvider.ExecuteCommand();dataProvider.CloseConnection();}}
}

OpenClosePrinciple

[L] Liskov Substitution Principle(里氏替换原则)

认为程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的

namespace LiskovSubstitutionPrinciple
{class Rectangle{protected int width = 0;protected int height = 0;public virtual void SetWidth(int width){this.width = width;}public virtual void SetHeight(int height){this.height = height;}public virtual int GetArea(){return this.width * this.height;}}class Square : Rectangle{public override void SetHeight(int height){this.height = height;this.width = height;}public override void SetWidth(int width){this.height = width;this.width = width;}}class Start{public static Rectangle CreateInstance(int condition = 1){if (condition == 1){return new Rectangle();}else{return new Square();}}public static void Invoke(){Rectangle rectangleObject = CreateInstance();rectangleObject.SetHeight(10);rectangleObject.SetWidth(20);rectangleObject.GetArea();}}
}

LiskovSubstitutionPrinciple

[I] Interface Segregation Principle(接口分离原则)

认为多个特定客户端接口要好于一个宽泛用途的接口,也有单一职责的意思

namespace InterfaceSegregationPrinciple
{interface IDataProvider{void OpenConnection();void CloseConnection();}interface ISqlDataProvider : IDataProvider{void ExecuteSqlCommand();}interface IOracleDataProvider : IDataProvider{void ExecuteOracleCommand();}class SqlDataProvider : ISqlDataProvider{public void ExecuteSqlCommand(){Console.WriteLine("执行Sql数据命令");}public void OpenConnection(){Console.WriteLine("打开Sql数据连接");}public void CloseConnection(){Console.WriteLine("关闭Sql数据连接");}}class OracleDataProvider : IOracleDataProvider{public void ExecuteOracleCommand(){Console.WriteLine("执行Oracle数据命令");}public void OpenConnection(){Console.WriteLine("打开Oracle数据连接");}public void CloseConnection(){Console.WriteLine("关闭Oracle数据连接");}}class Start{public void Invoke(){ISqlDataProvider sqlDataProvider = new SqlDataProvider();sqlDataProvider.OpenConnection();sqlDataProvider.ExecuteSqlCommand();sqlDataProvider.CloseConnection();IOracleDataProvider oracleDataprovider = new OracleDataProvider();oracleDataprovider.OpenConnection();oracleDataprovider.ExecuteOracleCommand();oracleDataprovider.CloseConnection();}}
}

InterfaceSegregationPrinciple

[D] Dependency Inversion Principle(依赖反转原则)

认为一个方法应该遵从依赖于抽象而不是一个实例,控制反转,依赖注入是该原则的一种实现

namespace DependencyInversionPrinciple
{interface IBankAccount{long BankNumber { get; set; } // 卡号decimal Balance { get; set; } // 余额
    }// 转账人interface ITransferSource : IBankAccount{void CutPayment(decimal value);}// 收款人interface ITransferDestination : IBankAccount{void AddMoney(decimal value);}class BankAccout : IBankAccount, ITransferSource, ITransferDestination{public long BankNumber { get; set; }public decimal Balance { get; set; }public void CutPayment(decimal value){Balance -= value;}public void AddMoney(decimal value){Balance += value;}}class TransferAmount{public decimal Amount { get; set; }public void Transfer(ITransferSource source, ITransferDestination dest){source.CutPayment(Amount);dest.AddMoney(Amount);}}class Start{void Invoke(){ITransferSource source = new BankAccout { Balance = 10000, BankNumber = 111 };ITransferDestination dest = new BankAccout { Balance = 1, BankNumber = 222 };TransferAmount transfer = new TransferAmount();transfer.Amount = 9999; // 转多少钱transfer.Transfer(source, dest); // 开始转账// 这是用依赖反转的思维做一个银行转账的功能,使银行账户可以依赖ITransferSource,ITransferDestination// 而不是以前直接 BankAccout account = new BankAccout();大大增加了账户这个核心对象的灵活性// 这个例子基本上有SOLID原则的所有身影
        }}// 附上一个普通版的 做下对比,用中文名做变量,通俗易懂吧class 银行账户{public int 卡号 { get; set; }public decimal 余额 { get; set; }public void 存入(decimal value){余额 += value;}public void 支出(decimal value){余额 -= value;}}class 银行转账操作 //ATM
    {public 银行账户 转账人 { get; set; }public 银行账户 收款人 { get; set; }public decimal 金额 { get; set; }public void 转账(){转账人.支出(金额);收款人.存入(金额);}}class Start1{public void Main(){银行账户 张三 = new 银行账户 { 卡号 = 111, 余额 = 10000 };银行账户 李四 = new 银行账户 { 卡号 = 222, 余额 = 5 };银行转账操作 转账 = new 银行转账操作();转账.金额 = 1000;转账.转账人 = 张三;转账.收款人 = 李四;转账.转账();}}
}

DependencyInversionPrinciple

SOLID设计原则是个老生常谈的话题了,在博客园居然没找到良好的代码实现,所以就自己参考网上的资料写了这么一篇博客,技术含量不高,给新手看的,包括我,个人认为掌握了这五点设计原则,并熟练运用于自己的系统中还是得花点时间的。反正我的观点就是:业务领域驱动设计原则。如果你不熟悉业务领域,你根本发挥不了这其中的优点,你会认为这样做反而麻烦了,但是又对于什么设计原则什么设计模式出于崇高的敬意,把网上书上的那些例子照着敲一遍二遍三遍。。。你会的也只不过是会写各种原则,模式的代码模板而已。so,学习设计模式的好方法是先弄懂一套业务领域的逻辑,然后在用你学到的设计模式的思想去挑刺儿。领域驱动模式设计给了我很大的启发,先敬畏业务领域,再敬畏软件设计,最后敬畏代码。当然平时也要用敬畏之心去看待事物。

转载于:https://www.cnblogs.com/Ax0ne/p/3619481.html

SOLID 设计原则 In C# 代码实现相关推荐

  1. solid设计原则_SOLID设计原则

    solid设计原则 介绍: Robert C. Martin定义了五项面向对象的设计原则: 小号英格尔-责任原则 Ø笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则,并 d epende ...

  2. 23种设计模式分类+SOLID设计原则+从设计模式角度看MVC框架

    目的:设计模式旨在帮助使用者设计可维护.可扩展.可复用.灵活性好的系统 1.  23中设计模式分类 1.1 创建型模式(5个) 工厂方法模式(Factory Method) 抽象工厂模式 (Abstr ...

  3. SOLID 设计原则

    SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...

  4. solid 设计原则 php,面向对象设计SOLID五大原则

    今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是: S = 单一 ...

  5. SOLID 设计原则 (有点长但很透彻)

    面向对象设计原则 SOLID 应该是职业程序员必须掌握的基本原则,每个程序员都应该了然于胸,遵守这 5个原则可以帮助我们写出易维护.易拓展的高内聚低耦合的代码. 它是由罗伯特·C·马丁(知名的 Rob ...

  6. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  7. java solid设计原则_设计模式之SOLID原则

    什么是SOLID原则 SOLID = SRP(职责单一原则) + OCP(对扩展开发,修改关闭原则)+ LSP(里氏替换原则)+ ISP(接口隔离原则)+ DIP(依赖反转原则) SRP: Singl ...

  8. SOLID设计原则解读

    SRP:单一职责原则 任何一个软件模块都应该只对某一类行为者负责 OCP:开闭原则 主要目标时让系统易于扩展,同时限制其每次被修改所影响的范围.实现方式就是将系统分为一系列组件,组件之间按层级关系分割 ...

  9. 流行20年的架构设计原则SOLID可能已经不适合微服务了

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏
  2. PO BO VO DTO POJO DAO概念及其作用(附转换图)
  3. 微信支付java helloworld_10行代码搞定微信支付(Java版)
  4. hadoop win环境依赖winutils.exe等的gitee下载地址
  5. 解锁设备_无师自通解锁新设备抗击疫情
  6. 层遇到select框时[收藏]
  7. html5自动打印图片,html2canvas生成清晰的图片实现打印代码示例
  8. MATLAB语言初步学习(四)
  9. Java实现分页的几种方式
  10. mysql 随机取数组_sql语句实现随机取n条数据(转)
  11. php微信号授权登录失败,php 微信授权登录 40029错误
  12. 正则匹配特殊符号及标点符号
  13. HAUT 1285: 军团再临【并查集*逆向思维】
  14. 使用乘法表计算GF(2^8)中的乘法
  15. spider_study 1
  16. 对话月薪10万的技术老兵:技术人如何开心工作、快乐赚钱?
  17. 戴尔微型计算机3048,戴尔5460一体机拆解,戴尔3048一体机
  18. (附源码)mysql+ssm学生选课系统 毕业设计 170920
  19. 孙俊 计算机技术资格水平考试,孙俊 - 专家学者 - - 计算机科学与技术 - 中南大学 - 学科服务平台...
  20. 可视化大屏原型图解决方案附axure可视化组件库

热门文章

  1. makefile 基础(转)
  2. Flutter Stack 帧布局,层叠堆放
  3. 0-1背包问题详解(DP分支限界回溯三种方法)
  4. centos yum方式安装nginx 并支持https
  5. Hibernate 多表关联
  6. MFC中获取App,MainFrame,Doc和View类等指针的方法
  7. js自动滚动条在底部
  8. [转]聚集索引和非聚集索引(sql server索引结构及其使用)
  9. 教你轻松搞定javascript中的正则
  10. 算法的概念与伪代码的使用