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) ...
随机推荐
- .net在arraylist用法
1.什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本号,它提供了例如以下一些优点: 动态的添加和降低元素 实现了ICollection和IL ...
- Android——保存并读取文件
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,仅仅能被应用本身訪问,在该模式下,写入的内容会覆盖原文件的内容,假设想把新写入的内容追加到原文件里.能够使用Contex ...
- ORA-07445: :一个意料之外的问题发生了 核心转储 [ldxsnf()+625] [SIGSEGV
ALERT登录错误消息: Mon Jan 20 15:03:22 2014 Incremental checkpoint up to RBA [0x442f.abd.0], current log t ...
- 划分数 (DP)
输入: n=4 m=3 M=10000 输出: 4 (1+1+2=1+3=2+2=4) 复杂度(nm) int n,m; int a[MAX]; int dp[MAX][MAX]; //数组 void ...
- Web Api 2, Oracle and Entity Framework
Web Api 2, Oracle and Entity Framework I spent about two days trying to figure out how to expose the ...
- Java数据结构与算法(13) - ch06递归(归并排序)
时间为O(N*logN). 归并排序的一个缺点是它需要在存储器中有另一个大小等于被排序的数据项数目的数组.归并两个有序的数组.利用递归,不断的将数组进行二分法排序,然后进行归并即可.
- Android物业动画研究(Property Animation)彻底解决具体解释
前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...
- Repository模式
Repository模式的两种写法与疑惑 现如今DDD越来越流行,园子里漫天都是介绍关于它的文章.说到DDD就不能不提Repository模式了,有的地方也叫它仓储模式. 很多时候我们对Reposit ...
- linux_vim_最佳快捷键
如何使用vi文本编辑器 vi由比尔·乔伊(Bill Joy)撰写,所有UNIX like均默认安装此文本编辑器.详细简介请点击维基中文. 1.首先复制一个文件到/tmp目录(本例中为复制根目录 ...
- 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!
原文:[百度地图API]发布静态图API啦!只需一个网址,即可展示定制百度地图! 摘要: 百度地图静态图API!您无须执行任何“特殊”操作便可在网页上显示此图片. 不需要 JavaScript.我们只 ...