Java设计模式(二)六大原则

文/大大大大峰哥

概述

在Java设计模式中,我们通常在设计上面需要遵循六大原则

单一职责原则

单一职责原则的定义

单一职责原则是一个类,引起它变化的原因只有一个.

该原则提出的是一个理想期望,任务对象不应该承担太多的职责,实现专注,才能保证对象的高内聚;单一性则可以保住对象的细粒度.高内聚与细粒度有利于对象的重用.当一个类承担了太多的职责,会造成冗余代码.

注意:单一职责原则不是只要求我们为类定义一个职责,而是提醒我们在一个类中尽量让类负载少的职责,从而保证对象具有高内聚与细粒度.

有时候我们在写项目的时候,比如是一个自行车的类,我们按照自行车一般的属性方法将这个类完善完毕,之后我们又有一个需求就是这个自行车具有某某特殊属性或者方法的自行车.这个时候在我们没有学习Java设计模式之前,我们会将这个特殊属性或者方法直接写入自行车类中.但是这个单一职责原则下,我们可以选择重新创造一个类(负责扩展原有自行车功能),这样就不会改变原有的类.这样有什么好处:

  • 降低类的复杂度
  • 提高类的可读性
  • 提高代码的可维护性和复用性
  • 降低因变更而引起的风险

单一职责原则的应用

在我们学习JavaEE的时候,JavaEE中的分层框架就体现了这个原则,将整个系统安装职责的内聚分为不同的层,每一层有一个主要的功能,关注事物一致.

Java EE框架

Presentation:表现层

Business:业务层

persistence: 持久层

Database:数据层

用我现在在写的项目来举例,Dao包中的类就是处理一些业务逻辑,DB包中就是一些数据库的增删改查.

里氏替换原则

大家不要看这个名字拗口,这个其实就是教我如何正确使用继承的.

里氏替换原则定义

如果对一个类型为S的对象o1,都有类型为T的对象o2,以S定义的所有程序P中所有的对象o1都替换成o2时,程序P行为没有发生变化,那么类型T是类型S的子类型.

打完上面的字我内心都是挣扎的,我感觉会有读者大声的说能不能说人话…其实这个里氏替换原则就是告诉我们什么是继承,如果你知道什么是继承,就可以直接跳过上面那段话...

注意:子类不能更改父类的访问权限

依赖倒置原则

依赖倒置原则的定义

  • 高层模块不应该依赖底层模型,两者都依赖其抽象
  • 抽象不依赖细节
  • 细节应该依赖抽象

我翻译翻译…抽象类指抽象类与接口.细节指已实现的类.在我们的Java项目中对该原则的表现:

  • 模块之间的依赖是通过抽象产生,实现类之间不发生直接的依赖关系.
  • 接口或者抽象类不依赖实现类,实现类依赖于接口或者抽象类.

这个原则也就是希望我们大量使用接口和抽象类,也可以理解成"面向接口编程OOD".依赖倒置原则可以减少类间的耦合性,提高系统稳定,降低并行开发引起的风险,提高可读性和可维护性.

依赖倒置原则的应用

上图只有IDriver与ICar之间存在依赖关系,而实现类中都没有直接关系,这就是依赖倒置原则的应用.

使用这个原则需要遵循几个规则:

  • 每个类应该都具有接口或抽象类,或者同时具备抽象类和接口.
  • 变量的表面类型尽量是接口或者是抽象类
  • 任何类都不应该从具体类派生
  • 尽量不应该重写基类的方法
  • 结合里氏替换原则使用

依赖倒置原则是六中设计原则中最难以实现的原则,它是实现开闭原则的重要途径.在项目中抓住"面向接口编程"的思想就基本抓住了依赖倒置的原则

接口隔离原则

这里先理解什么是接口.接口分为两种:

  • 实例接口:Person 张三=new Person(),在这里的张三就是Person的实例接口
  • 类接口:在我们使用多线程的时候,大家肯定发现有一个接口叫做java.lang.Runnable这个就是一个类接口.

接口隔离原则的定义

  1. 客户端不应该依赖它不需要的接口.
  2. 类间的依赖关系应该建立在最小的接口上.

接口相当于一个角色,我们不应该将不同的角色都交给一个接口.同时不应该强迫客户依赖于他们不用的方法,这一点十分重要.

在我们日常编码的过程中一个类,往往会有不同性质的对象,比如一个汽车,可能有奔驰,宝马,凯德拉克,特使拉等等,这些不同的车有一些不同的特性,对待这些不同的特性我们应该对应每一个不同的品牌写不同的接口.

接口隔离原则的应用

上面的应用实践可以看出一个接口只对一个子模块或者业务逻辑进行服务.这里还要提醒接口不是越小越好,接口太小则会导致接口数量剧增,给开发带来难度;如果接口太大,灵活性降低,将无法提供定制服务,给项目带来无法预计的风险.

迪米特法则

迪米特法则的定义

国外的定义往往通常是以发现者的名字所取名的,这个法则又叫做最少只是原则,其意义是:一个对象应当对其他对象尽可能的少的了解,其中对迪米特法则最具有代表性的几种表述如下:

  • 只同你直接的朋友们通信
  • 不要跟陌生人说话
  • 每一个软件单位对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密切相关的软件单位

其实意义就是两个类之间的联系是通过一个朋友类相互关联,这样可以减少类之间的关系,降低类之间的耦合,提高类的复用率.

迪米特法则的应用

我通过call方法传递进我的Friend,然后同Friend中的变量Stranger,我可以间接访问Stranger中方法,这样Friend就是一个类似介质的功能.

这里我对这个法则的感悟不是很深,暂时先记住,以后在后续的开发过程中可能可以找到这个法则的应用场景,和一些优点.

开闭原则

开闭原则的定义

一个软件应当对扩展开放,对修改关闭.

在设计一个模块的时候,应当使用这个模块可以在不被修改的前提下被扩展.面向对象编程中,开闭原则是最基本的原则,其他五大原则(单一职责,迪米特原则,里氏替换原则,依赖倒置原则,接口隔离原则)这些都是开闭原则的具体形态,以及是开闭原则的手段和工具.开闭原则一般可以通过以下几个方面体现:

  • 开闭原则提高复用性
  • 开闭原则提高可维护性
  • 开闭原则提高灵活性
  • 开闭原则有利测试

开闭原则的应用

上图是一个书店商品正常情况下的类.因为商店的促销需要来一个打折,所以在之前类通过继承的方式解决了这个问题.

这个就是开闭原则的体现对扩展开放,对修改关闭,我没有修改之前的代码,同时实现了功能的扩展,这是面向对象编程中至关重要的.

开闭原则解决问题的关键在与抽象化.把所有可能的行为抽象为抽象底层,这个抽象底层规定了所有的具体实现必须提供的方法的特征,给系统定义一个一劳永逸的抽象设计,设计允许有无穷尽的行为在实现层被实现.

在抽象层一定要竟可能的预见所有可能的扩展,在任何扩展情况下的系统的抽象底层不需修改,从而满足开闭原则的第二条(对修改关闭).通过从抽象层导出一个或多个新的具体类改变系统的行为,通过使用新的行为来扩展,从而满足开闭原则的第一条(可以扩展).

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

推荐阅读更多精彩内容

  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 765评论 0 1
  • 转载标注声明:http://www.uml.org.cn/sjms/201211023.asp 目录:[设计模式六...
    Bloo_m阅读 707评论 0 7
  • 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 ...
    Jabir_Zhang阅读 643评论 0 3
  • 设计模式之六大原则(转载) 关于设计模式的六大设计原则的资料网上很多...
    霄霄霄霄阅读 898评论 0 1
  • 前言 设计模式六大原则网上资料比较多比较乱,本文将网上的一些好的资料做一下整理,以便随时翻阅。友情提示,设计模式虽...
    简单的土豆阅读 1,431评论 0 10