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(观察者) 等设计模式,而没有把足够多的注 ...
随机推荐
- P1280 尼克的任务 dp
思路: 倒着DP f[i]表示i时刻的空闲时间最大值 在当前时间没有任务开始 f[i]=f[i+1]+1; 上一分钟最大空闲时间+1 在当前时间有任务开始 f[i]=max(f[i],f[i ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...
- 【agc030f】Permutation and Minimum(动态规划)
[agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...
- wcf 发布到iis后报错
HTTP Error 404.3 - Not Found http://iweb.adefwebserver.com/Default.aspx?tabid=57&EntryID=34 未能从程 ...
- ELK部署详解--logstash
logstash.yml # Settings file in YAML## Settings can be specified either in hierarchical form, e.g.:# ...
- CF1131F Asya And Kittens(Kruskal重构树,启发式合并)
这题难度1700,我感觉又小了…… 这题虽然没几个人是用kruskal重构树的思想做的,但是我是,所以我就放了个kruskal重构树的标签. 题目链接:CF原网 题目大意:有一个长为 $n$ 的排列, ...
- Git Base For Linux
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html Linux安装git,做个记录吧(使用github提供的隐私邮箱) # git官 ...
- 时间复杂度和大O表示法
大O表示法:称一个函数g(n)是O(f(n)),当且仅当存在常数c>0和n0>=1,对一切n>n0均有|g(n)|<=c|f(n)|成立,也称函数g(n)以f(n)为界或者称g ...
- MariaDB安装及基本配置
MariaDB安装及基本配置(CentOS6.9) 数据库基础概念 数据库(Database, DB)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. DBMS: Database ...
- Oracle 的常用概念
SQL优化(数据库的优化) 1. 尽量使用列名(不用*) 2. where解析顺序: 右--> 左 3. 自连接不适合操作大表 4. 尽量使用多表查询不使用子查询语句 5. 尽量不要使用集合运算 ...