SOLID 设计原则 In C# 代码实现
[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 SQL
class SqlDataProvider:DataProvider
{
public override void OpenConnection()
{
Console.WriteLine("打开Sql数据连接");
}
public override void CloseConnection()
{
Console.WriteLine("关闭Sql数据连接");
}
public override void ExecuteCommand()
{
Console.WriteLine("执行Sql数据命令");
}
}
// ORACLE
class 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 = ;
protected int height = ;
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 = )
{
if (condition == )
{
return new Rectangle();
}
else
{
return new Square();
}
}
public static void Invoke()
{
Rectangle rectangleObject = CreateInstance();
rectangleObject.SetHeight();
rectangleObject.SetWidth();
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 = , BankNumber = };
ITransferDestination dest = new BankAccout { Balance = , BankNumber = };
TransferAmount transfer = new TransferAmount();
transfer.Amount = ; // 转多少钱
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 银行账户 { 卡号 = , 余额 = };
银行账户 李四 = new 银行账户 { 卡号 = , 余额 = };
银行转账操作 转账 = new 银行转账操作();
转账.金额 = ;
转账.转账人 = 张三;
转账.收款人 = 李四;
转账.转账();
}
}
}
DependencyInversionPrinciple
SOLID设计原则是个老生常谈的话题了,在博客园居然没找到良好的代码实现,所以就自己参考网上的资料写了这么一篇博客,技术含量不高,给新手看的,包括我,个人认为掌握了这五点设计原则,并熟练运用于自己的系统中还是得花点时间的。反正我的观点就是:业务领域驱动设计原则。如果你不熟悉业务领域,你根本发挥不了这其中的优点,你会认为这样做反而麻烦了,但是又对于什么设计原则什么设计模式出于崇高的敬意,把网上书上的那些例子照着敲一遍二遍三遍。。。你会的也只不过是会写各种原则,模式的代码模板而已。so,学习设计模式的好方法是先弄懂一套业务领域的逻辑,然后在用你学到的设计模式的思想去挑刺儿。领域驱动模式设计给了我很大的启发,先敬畏业务领域,再敬畏软件设计,最后敬畏代码。当然平时也要用敬畏之心去看待事物。
SOLID 设计原则 In C# 代码实现的更多相关文章
- 适用于Java开发人员的SOLID设计原则简介
看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的 ...
- 工作那么久,才知道的 SOLID 设计原则
认识 SOLID 原则 无论是软件系统设计,还是代码实现,遵循有效和明确的设计原则,都利于系统软件灵活可靠,安全快速的落地,更重要的是能灵活地应对需求,简化系统扩展和维护,避免无效的加班.本文主要讨论 ...
- SOLID设计原则
SOLID设计原则 Single Responsibility Principle单一职责原则 单一职责原则(SRP)表明一个类有且只有一个职责. 一个类就像容器一样,它能添加任意数量的属性.方法等. ...
- SOLID 设计原则
SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...
- c#六大设计原则(以仪器代码为例)
[有格式的原文请到https://www.cnc6.cn/c六大设计原则/文末下载] 软件设计原则常见的有6大原则,分别为: ①单一职责原则: ②开闭原则: ③依赖倒置原则: ④里氏替换原则: ⑤接口 ...
- 面向对象SOLID设计原则之Open-Closed原则
首先,我们看下开放-封闭原则(Open-Closed Principle,简称OCP)的概念: 是指软件实体(类.模块.函数等)应该可以扩展,但是不可修改. 任何新功能(functionality)应 ...
- PHP的SOLID设计原则
SOLID Design Principles, 这是一个比设计模式更高级别的概念, 以构建良好代码为目标,真正掌握了就是大师级别了. 我~~~仅知晓~ /*SOLID Design Principl ...
- SOLID架构设计原则
最近通读了<架构整洁之道>,受益匪浅,遂摘选出设计原则部分,与大家分享,希望大家能从中获益. 以下为书中第3部分 设计原则的原文. 设计原则概述 通常来说,要想构建-个好的软件系统,应该从 ...
- 经典设计原则 - SOLID
SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Principle, OCP) ...
随机推荐
- Java流
流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象.即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作. 流的分类: 数据类型 ...
- 【Java】【jquery】ajax垃圾问题
1.暗示HTML.JSP文件本身使用UTF-8格公式 2.HTML的head加: <META http-equiv="Content-Type" content=" ...
- 架构设计之设计模式 (一) 适配器(Adapter)---提高复用性
简介 简介是为了描述一下该模式是干嘛用的,为了让不了解该模式的人看了之后也有一些新的认识. 本文章分为两部分,第一部分主要介绍适配器模式:第二部分介绍该模式与相近模式的异同. 下午一直在讨论设计模式, ...
- DevExpress Report 其他常用设计技巧
原文:DevExpress Report 其他常用设计技巧 1 设置默认的打印纸张及页边距 选择Report-打开属性窗口,设置默认边距(Margins)和默认纸张(PaperKind). 2 修改R ...
- ACdreamoj(1105)模拟题
题意:射一次激光最多能够攻击到几个敌人(因为激光非常强大,能够在击中敌人后穿过它,而瑶瑶自己的坦克因为有特殊装置,所以不会被激光击中.激光也会直接穿过它) . 表示此处为空地 * 表示此处为障碍(激光 ...
- SD3.0四个协议解读
前面的文章提到过SD卡主要分为两个操作模式,一是初始化和识别操作模式.还有一种就是这篇文章须要分析的传输数据模式啦. 传输数据模式: 传输数据模式主要有六种状态,各自是Stand-by状态.Trans ...
- monkey命令详解
标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v 产生500次随机事件,作用在 ...
- 优秀的前端project如何制定一个老师--html学习路径
一个好的前端project教师发展,不是一蹴而就,它需要大量的学习和积累. 至于谁刚开始学习的人,如何入门.学习如何选择我的路线,做了各种工具? 1. 学习之前 1.不要着急看一些复杂网页效果的代码 ...
- 高效率的Shell
1. 批量将Excel转为CSV文件 XLSX2CSV: https://github.com/dilshod/xlsx2csv sudo easy_install xlsx2csv #安装Xlsx2 ...
- [CLR via C#]5.2 引用类型和值类型
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...