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) ...
随机推荐
- HDU 4349 Xiao Ming's Hope
非常无语的一个题. 反正我后来看题解全然不是一个道上的. 要用什么组合数学的lucas定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 假 ...
- Python - 缩写(capwords) 和 创建转换表(maketrans) 详细说明
缩写(capwords) 和 创建转换表(maketrans) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27051 ...
- 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法
原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ...
- 使用C#或javascript将Table里的数据导出到Excel
原文:使用C#或javascript将Table里的数据导出到Excel Demo效果图: 用C#将Table数据导出Excel: 本方法已经将导出excel做成分部视图,引用时只需在视图中使用如下代 ...
- hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others) ...
- 第9章 组合模式(Composite Pattern)
原文 第9章 组合模式(Composite Pattern) 概述: 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理 ...
- Java数据结构系列——简单排序:泡、选择、直接进入
package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...
- 从头学起android<GridView网格视图.二十八.>
GridView基于组件的网络格所有的形式的组分的,例如:当制作专辑,所有的图片将在相同的尺寸在不同的显示格在孩子,是否能够依靠这个组件完成.此组件的继承结构参见例如下面: java.lang.Obj ...
- Oracle 11g 环境,使用utl_smtp创建一个存储过程来发送邮件
太多的在线电子邮件存储过程.我不转发,弄个作为一个简单的例子演示. create or replace procedure Send_mail(mail_body varchar2) is smtp_ ...
- Jquery()核心函数的7个重载方法
(1) jquery() 该函数返回一个空的jQuery对象.在jQuery1.4以后的版本中,改函数返回一个空的jQuery对象.在之后的版本中,该函数会返回一个包含document节点的对象. ( ...