设计模式与设计原则

设计模式是什么

程序员为了编写出,优雅,可读性强,高内聚低耦合的代码。为了实现这一目标,使出浑身解数,总结出来了一套编码的经验,这些经验就是设计模式。

所以说设计模式是一种经验,是一种针对某种业务模型的编码经验,设计模式是一种经验。

从另一个角度,也可以说设计模式是概念模型,举个例子,生产者消费者模式,会有生产者角色,会有消费者角色,有消息角色,角色之间的关系是什么样的。

正因为,设计模式,是经验,是模型,而不是某一个具体的定型,所以不同开发人员的实现方式是可以不一致的。

设计模式一般遵循六大设计原则,也可以这样说说,如果你可以遵循六大设计原则,总结出自己在某个业务场景下的编码经验,你就创造了设计模式。

单一职责原则

如果需要开发的一个功能需求不是一次性的,且随着业务发展的不断变化而变化,那么当一个Class类负责超过两个及以上的职责时,就在需求的不断迭代、实现类持续扩张的情况下,就会出现难以维护、不好扩展、测试难度大和上线风险高等问题。

所谓的职责就是指类变化的原因,也就是业务需求。如果一个类有多于一个的原因被改变,那么这个类就有超过两个及以上的职责。而单一职责约定一个类应该有且仅有一个改变类的原因。

定义class类 定义公共抽象接口,根据抽象接口使用不同的类实现,比如,视屏网站,普通用户,会员用户,超级会员用户。

其次,定义接口时,竟可能让该接口粒度细化只包含该角色层面,比如知名的开发框架dubbo中很多接口是只包含一个方法的,即便让一个类实现多一点的接口。

单一职责,用大白话说,不要把代码写在一起,且按角色分类。

image-20211225200147228

开闭原则

开闭原则是后面一系列规则的鼻祖,这里要重点理解。

一般认为最早提出开闭原则的是伯特兰.迈耶。他在1988年发表的《面向对象软件构造》中给出的。在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性。开闭原则的核心思想也可以理解为面向抽象编程。典型的案例,就是SPI。

开闭原则,用大白话说,就是允许扩展,不允许修改。

典型的落地方式有,继承,AOP,SPI。继承待扩展的类,编写拓展代码和属性。

这是计算面积的例子,我想扩展π的精度。通过继承类编写覆盖方法。


image-20211225201528703
image-20211225201557584

里式替换原则

是一种从兼容性上出发思考的原则,是实现开闭原则的重要方式之一,她是开闭原则的一种落地实现。

如果S是T的子类型,那么所有T类型的对象都可以在不破坏程序的情况下被S类型的对象替换。简单来说,子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,当子类继承父类时,除添加新的方法且完成新增功能外,尽量不要重写父类的方法。这句话包括了四点含义:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

  • 子类可以增加自己特有的方法。

  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松。

  • 当子类的方法实现父类的方法(重写、重载或实现抽象方法)时,方法的后置条件,即方法的输出或返回值要比父类的方法更严格或与父类的方法相等。

用抽象类代替普通父类,在抽象类中实现公共方法,在子类中做具体功能的拓展。

典型的案例,信用卡,和储蓄卡,信用卡消费是生成还款单,而储蓄卡消费则是扣减金额。

迪米特法则原则

迪米特法则是指一个对象类对于其他对象类来说,知道得越少越好。也就是说,两个类之间不要有过多的耦合关系,保持最少关联性。迪米特法则有一句经典语录:只和朋友通信,不和陌生人说话。也就是说,有内在关联的类要内聚,没有直接关系的类要低耦合。这样的例子在我们生活中也随处可见,就像家里的水管装修,有洗衣机地漏、卫生间地漏、厨房地漏,但它们最终都汇到同一个污水处理系统里。在平常使用时,我们不会考虑这些水管是怎么关联流向的,只需要考虑最上层的使用即可。

迪米特法则有一句经典语录:只和朋友通信,不和陌生人说话。

举个例子,校长,老师,学生。

校长想知道每个班有多少学生,应该只和老师沟通,而不是自己计算。计算学生的任务交给老师。

校长和老师沟通,老师和学生沟通。

接口隔离原则

所谓接口隔离原则,即尽量避免,一个类实现了一个接口之后,需要实现一些他不需要的功能。接口隔离是为了高内聚、低耦合。在实际的业务开发中,通常会先定义好需要开发的接口,并由各个服务类实现。但如果没有经过考虑和设计,就很可能造成一个接口中包括众多的接口方法,而这些接口并不一定在每一个类中都需要实现。

这样的接口很难维护,也不易于扩展,每一次修改验证都有潜在的风险。

在具体应用接口隔离原则时,应该根据以下几个规则衡量。

  • 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
  • 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
  • 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素, 环境不同,接口拆分的标准就不同,要深入了解业务逻辑。
  • 提高内聚,减少对外交互。让接口用最少的方法完成最多的事情。

典型的案例,在spring框架和dubbo框架中的很多接口,只有一个方法。

依赖倒置原则

依赖倒置原则,是指在设计代码架构时,高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

依赖倒置原则其是实现开闭原则的重要途径之一,它降低了类之间的耦合,提高了系统的稳定性和可维护性,同时这样的代码一般更易读,且便于传承。他也是实现开闭原则的一条途径。

举个例子,在互联网的营销活动中,经常为了拉新和促活,会做一些抽奖活动。这些抽奖活动的规则会随着业务的不断发展而调整,如随机抽奖、权重抽奖等。其中,权重是指用户在当前系统中的一个综合排名,比如活跃度、贡献度等。

  • 首先是按照抽象接口IDraw 实现各自的抽奖的实现。

  • 然后呢生成以下工具类,供应用层调用。

image-20211225211335256

在这个类中体现了依赖倒置的重要性,可以把任何一种抽奖逻辑传递给这个类。这样实现的好处是可以不断地扩展,但是不需要在外部新增调用接口,降低了一套代码的维护成本,并提高了可扩展性及可维护性。另外,这里的重点是把实现逻辑的接口作为参数传递,在一些框架源码中经常会有这种做法。

个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容