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) ...
随机推荐
- 2014在百度之星资格赛的第四个冠军Labyrinth
Problem Description 熊度仅仅是一种冒险的熊,一个偶然落入一个m*n迷宫矩阵,能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫.每一次仅仅能走一格,且仅仅能向 ...
- .net Framework各个版本之间的发展
原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET FrameWork,身为一个NET程序员,里面大概的区别自己还 ...
- 网络资源(6) - EJB视频
2014_08_24 http://v.youku.com/v_show/id_XMjE0NjE3MDA0.html?f=5227828 01_EJB3.0_下载安装与运行jboss -------- ...
- eclipse 组态xdebug
1.打开浏览器打开phpinfo页面视图PHP版本号.TS(线程安全)版本NTS(非线程安全)版本.以及VC6版本号是VC9版本号 2.和上面版本号相应的xdebug:http://xdebug.or ...
- javascript中用来定义引用类型的一种"默认"模式
// 终极版:组合使用构造函数模式和原型模式:***************************** // 评价:集构造函数模式和原型模式之大成: 用来定义引用类型的一种默认模式 function ...
- WebView无法放大缩小解决方式
先看看我们之前所写的代码 1) 加入权限:AndroidManifest.xml中必须使用了许可"android.permission.INTERNET" 2) 使用了一个WebV ...
- hbase ganglia监控配置
hbase ganglia 显示器 hbase 构造 hadoop-metrics2-hbase.properties *.sink.ganglia.class=org.apache.hadoop.m ...
- linux在构建SVNserver
最近搞了一个云计算server,一些尝试部署server相关的东西.作为用显影剂server.首先要考虑的是建立SVNserver.关于构建过程记录.方便以后. 一.安装svn软件.有些云server ...
- 利用EntityFramework获得双色球数据库
原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...
- The Swift Programming Language-官方教程精译Swift(4)字符串和字符
String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 ...