C#设计模式(0)——设计原则
设计原则
使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性。在进行设计的时候,我们需要遵循以下几个原则:单一职责原则、开闭原则、里氏替代原则、依赖倒置原则、接口隔离原则、合成复用原则和迪米特法则。
1.单一职责原则
专业的人做专业的事,面向对象编程中类也是一样,一个类只负责一些特定的职责,如User类只负责用户相关的业务功能,Order类只负责订单相关的功能,想象下如果我们把用户和订单的功能放在一个类,然后去设计用户的权限中会怎么样呢?订单业务和权限耦合了。。单一职责原则作用是降低职责间的耦合,同时提高代码的复用率。
2.接口隔离原则
接口隔离原则指的是提倡使用多个专门的接口,而不是使用一个总的接口。以一个订单系统为例,我们自己的系统可以对订单进行增删改查操作,给第三方只提供了查询操作。如果把增删改查的功能都定义在一个接口中那么第三方的实现类也要做增删改的实现。分成两个接口就避免了这种情况。
public interface IOrderService1
{
void Add();//添加
void Delete();//删除
void Edit();//修改
}
public interface IOrderService2
{
void Query();
}
//我们用的订单服务类
public class MyOrderService : IOrderService1, IOrderService2
{
public void Add(){//添加操作} public void Delete(){//删除操作} public void Edit() {//修改操作} public void Query(){//查询操作}
}
//给第三方提供的订单服务类
public class OtherOrderServeice : IOrderService2
{
public void Query(){//查询操作}
}
3.开闭原则
开闭原则通俗的讲就是对添加(扩展)开放,对修改关闭。如我们维护一个软件系统,这时要添加一个新功能,我们可以写新代码来添加这个功能,但是不能修改以前的代码,想象下我们为了新功能修改了一些旧代码,然后发现一些旧的功能挂掉了时的心情。
4.里氏替代原则
里氏替代原则指的是父类存在的地方,子类都可以替换,并且行为不发生改变,只有所有的父类都可以被子类替代且行为不发生变化时才能说明父类是可复用的。一个违背里氏替换原则的例子:我们定义了鸟类有fly方法,表示鸟类都可以飞,但是企鹅也是鸟类而且企鹅不会飞,这时企鹅(子类)就不能替代其鸟类(父类)了,说明我们设计的鸟类违背了里氏替代原则。
5.合成复用原则
合成复用指的是一个对象A包含了另一个对象B,那么A就可以委托B来使用B的功能。一个例子:
//订单类
public class Order
{
public User user;//订单中有用户
}
//用户类
public class User
{
public string UserName { get; set; }
public string getName()
{
return this.UserName;
}
}
上边的例子中订单中包含了用户,我们可以使用order.User.getName();order委托其属性user来调用User类中的方法。注意合成复用用于“has-a”场景,例子中订单has-a用户,订单和用户是包含关系;“is-a"场景则要使用继承,如学生is-a人类,学生要继承于人类。
6.依赖倒置
依赖倒置原则作用是方便实现类的切换,降低业务要求和具体实现间的耦合。抽象不应该依赖细节,而细节应该依赖抽象,这就是我们为什么使用面向接口编程,而不是面向实现编程的原因。
7.迪米特法则(最小知道原则)
迪米特法则指的是各个类之间应该尽可能的不了解,最好是相互独立的。但是很多时候类与类之间不可避免的要传输信息,如上边的Order和User就存在强依赖关系,我们应该尽可能地降低类和类间的依赖。怎么降低依赖呢?一种常用的方式是通过中间件(如redis/rabbitmq/autofac等)来降低依赖。如A和B类要通信,原始的方式是new一个实例出来直接通信 A<-->B ,现在我们用一个中间件充当传话人那么A和B通信就变成了 A<-->中间件<-->B 形式,这样A和B就降低了耦合。
设计模式中的外观模式和中介者模式就使用了迪米特法则。
C#设计模式(0)——设计原则的更多相关文章
- Java设计模式学习——设计原则
第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...
- JavaScript设计模式之设计原则
何为设计 即按照哪一种思路或者标准来实现功能,功能相同,可以有不同的设计方案来实现 伴随着需求的增加,设计的作用就会体现出来,一般的APP每天都在变化,更新很快,需求不断在增加,如果设计的不好,后面很 ...
- 设计模式之设计原则 C#
成为一名资深架构师首先要懂设计模式,在懂之前,要清楚设计原则,原来我就吃过这个亏,很久以前有人问我设计原则,我是一头茫然,不是只有设计模式吗?且不知设计原则就像是写书法一样,楷体就是方正,竖道有垂露等 ...
- java设计模式和设计原则
一.创建型模式 1.抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类.2.生成器模式(Builder patter ...
- 设计模式——<面向对象设计原则以及23种设计模式分类>
一.面向对象八大设计原则: 1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) . 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽 ...
- 年终知识分享——UML、设计模式、设计原则
...
- python的设计原则及设计模式
python的设计原则及设计模式 七大设计原则 单一职责原则 [SINGLE RESPONSIBILITY PRINCIPLE] 一个类负责一项职责. 里氏替换原则 [LISKOV SUBSTITUT ...
- 设计模式(含UML、设计原则、各种模式讲解链接)
一.统一建模语言UML UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法 UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进 ...
- Java程序员应当知道的10个面向对象设计原则
面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...
随机推荐
- 吉哥系列故事――恨7不成妻 HDU - 4507 数位dp
思路 和普通的DP不一样的是 这里求的是满足条件的数的平方的和 而数位DP只跟数每位是什么密切相关 所以要开一个结构 (多加一个 数的和sum 和平方和qsum)存一下各个状态的和的情况 dp[p ...
- Matplotlib学习---用matplotlib画雷达图(radar chart)
雷达图常用于对多项指标的全面分析.例如:HR想要比较两个应聘者的综合素质,用雷达图分别画出来,就可以进行直观的比较. 用Matplotlib画雷达图需要使用极坐标体系,可点击此链接,查看对极坐标体系的 ...
- PHP获取网络图片并保存在本地目录
PHP获取网络图片并保存在本地目录思路: 代码如下: function file_exists_S3($url) { $state = @file_get_contents($url,0,null,0 ...
- 【dfs】p1731 生日蛋糕
1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高 ...
- 【linux】linux查找功能
linux系统中我们经常会需要查找某些文件,当有时候我们不确定一个文件的位置,比如某服务配置文件具体路径,自己没有头绪去寻找的话会很难找,也会耽误时间.linux就提供了很多命令,find,locat ...
- can 网络管理
网络管理主要功能: 是用来管理ECU是否在网络里面,不在的话请求加入,也就是ALIVE报文, 要判断是否掉线,以及睡眠状态的转换机制,以及跛行状态判,也即是RING报文. 主要的实现逻辑流程: 从rt ...
- Mybatis 缓存失效的几种情况
1 不在同一个sqlSession对象中 下面比较下载同一个sqlSession和不在同一sqlSession下面的两种情况: 同一sqlSession: @Test public final voi ...
- 解决SecureCRT无法用非root账号登录ssh
原文: http://blog.csdn.net/zxx2403/article/details/46959047 链接失败,提示这个: --------------------------- Sec ...
- CodeForces 407C 组合数学(详解)
题面: http://codeforces.com/problemset/problem/407/C 一句话题意:给一个长度为n的序列g,m次操作,每次操作(l,r,k)表示将g[l]~g[r]的每个 ...
- LOJ#2722 情报中心
解:有个暴力是枚举两条链然后O(n)判定,可以得到15分. 还可以优化一下,枚举一条链,然后第二条链直接求两端点树上带权距离.可以做到O(m(n + m)),但是我用的树剖,跟上面那一档没啥区别Orz ...