设计模式——七大原则
设计模式——七大原则
- 汇总篇
- 1、单一职责
- 2、接口隔离
- 3、依赖倒转
- 4、里氏代换原则
- 5、开闭原则
- 6、迪米特法则
- 7、合成复用
汇总篇
1、单一职责
对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责一需求变更而改变A时,可能照成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
违背原则示例:
public static void run(Integer type,String vehicle) {if (type == 1){System.out.println(vehicle + "在公路上运行");}else if (type == 2){System.out.println(vehicle + "在天空飞");}else {System.out.println(vehicle + "在水里游");}
}
符合原则代码:
1、这种方法没有对原来的类做大的修改,只是增加方法。
2、这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责。
public class Only {public static void run(String vehicle) {System.out.println(vehicle + "在公路上运行");}public static void runAir(String vehicle) {System.out.println(vehicle + "在天空飞");}public static void runWater(String vehicle) {System.out.println(vehicle + "在水里游");}
}
单一职责原则注意事项与细节:
- 降低类的复杂度,一个类只负责一项职责。
- 降低类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责
2、接口隔离
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
就是将一个类拥有很多接口拆成多个类较少接口,实现接口隔离,不需要引入不需要的接口。
违背原则示例:
public interface interface0{void operation1(); // 产品void operation2(); // 程序员1号void operation3(); // 程序员2号void operation4(); // 测试void operation5(); // 运维}
// 实现类
static class work implements interface0{@Overridepublic void operation1() {}@Overridepublic void operation2() {}@Overridepublic void operation3() {}@Overridepublic void operation4() {}@Overridepublic void operation5() {}}
符合原则代码:
public class Segregation {/*** ---------------------------------拆开多个接口---------------------------------------------*/public interface interface1{ // 产品接口void operation1(); }public interface interface2{ // 程序员void operation2();void operation3();}public interface interface3{ // 测试void operation4();}/*** ---------------------------------类实现接口---------------------------------------------*/static class B implements interface2{@Overridepublic void operation2() {System.out.println("B实现接口2的方法");}@Overridepublic void operation3() {System.out.println("B实现接口2的方法");}}
}static class B implements interface3{@Overridepublic void operation4() {System.out.println("B实现接口3的方法");}
}
使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
3、依赖倒转
- 1、高层模块不应该依赖低层模块,二者都应该依赖其抽象。
- 2、抽象不应该依赖细节,细节应该依赖抽象
- 3、依赖倒转的中心思想是面向接口编程
- 4、依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
- 5、使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
违背原则代码
public static void main(String[] args) {Person person = new Person();Email email = new Email();person.IReceiver(email); }public static class Person{ // 接收人public void IReceiver(Email email){System.out.println(email.info());}}public static class Email{String info(){return "邮件信息";}}
此时又想接收微信消息,还要再重新修改
符合原则代码:
public static void main(String[] args) {IReceiver iReceiver = new Email(); // 接收邮件消息System.out.println(iReceiver.getInfo());// 要想再接收微信IReceiver iReceiver1 = new Weixin();System.out.println(iReceiver1.getInfo());}// 定义接口interface IReceiver{public String getInfo();}/*** ---------------------------------以下用实现类来做具体的细节操作---------------------------------------------*/static class Email implements IReceiver{@Overridepublic String getInfo() {// 这里实现细节return "邮件消息";}}static class Weixin implements IReceiver{@Overridepublic String getInfo() {// 这里实现细节return "微信消息";}}
依赖倒转原则的注意事项和细节:
1、低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好。
2、变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
3、继承是遵守里氏代换原则。
4、里氏代换原则
一、OO中的继承性的思考和说明
1、继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契
约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实
现的方法任意修改,就会对整个继承体系造成破坏。2、继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵
入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,
则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子
类的功能都有可能产生故障
要使用好继承,就要了解里氏代换原则
二、基本了解
- 1、在使用继承时,遵循里氏替换原则,
在子类中尽量不要重写父类的方法
- 2、里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可
以通过聚合,组合,依赖 来解决问题
。 - 3、如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序
P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1
的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。.
就是当B类最好不要直接继承A类,去重写它,要再建一个更基础的类,两个都去继承,增强两个类的耦合性
违背原则代码
class A{// 返回两个数的差public int func1(int num1,int num2){return num1 - num2;}}class B extends A{// 返回两个数的和public int func2(int num1,int num2){return num1 + num2;}@Overridepublic int func1(int num1, int num2) {return super.func1(num1, num2);}}
符合原则代码:
public class Lsdh {// 创建一个更加基础的类class Base{// 把更基础的方法和成员写到Base类}class A extends Base{// 返回两个数的差public int func1(int num1,int num2){return num1 - num2;}}class B extends Base{// 返回两个数的和public int func2(int num1,int num2){return num1 + num2;}// 如果B需要使用A类的方法,使用组合关系private A a = new A();public int func3(int num1,int num2){return a.func1(num1,num2);}}
}
5、开闭原则
- 1、 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则
- 2、 一个软件实体如类,模块和函数应该
对扩展开放(对提供方),对修改关闭(对使用方)
。用抽象构建框架,用实现扩展细节。 - 3、 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 4、 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
违背原则代码
public static void main(String[] args) {// 画图功能GraphicEditor graphicEditor = new GraphicEditor();// 画一个正方形graphicEditor.draw(1,"正方形");}static class GraphicEditor{public void draw(Integer type,String draw) {if (type == 1){// 画正方形}else if (type == 2){// 画长方形}}}
如果要新增功能时,会修改到旧代码,要是旧代码是别人写的,可能会牵一发而动全身,出了好几个bug
符合原则代码
public class Ocp {public void main() {// 画图功能GraphicEditor graphicEditor = new GraphicEditor();// 画一个正方形graphicEditor.drawShape(new square()); // 如果还要再画一个长方形,不需要改代码,直接扩展graphicEditor.drawShape(new rectangle());}// 要调用画图方法的类static class GraphicEditor{public void drawShape(draw draw) {draw.drawFunc();}}// 定义一个画图接口interface draw{// 画画的方法void drawFunc();}// 实现画图接口,作画class square implements draw{@Overridepublic void drawFunc() {System.out.println("画了个正方形!");}}// 实现画图接口,作画class rectangle implements draw{@Overridepublic void drawFunc() {System.out.println("画了个长方形!");}}
}
这个原则讲的就是,将代码写的扩展性高点,如果新增功能,不用去改旧代码,直接新增新的功能
6、迪米特法则
一、基本介绍
1、迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的
越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内
部。对外除了提供的public 方法,不对外泄露任何信息2、一个对象应该对其他对象保持最少的了解
违法原则代码
// 咖啡类static class coffee{//泡咖啡public void make(){// 1、烧水// 2、磨咖啡粉// 3、泡}// 找秘书过来public String secretary(){return "过来";}}public static void main(String[] args) {coffee coffee = new coffee();coffee.make();coffee.secretary();}
符合原则代码:
// 咖啡类static class coffee{//泡咖啡public void make(){// 1、烧水// 2、磨咖啡粉// 3、泡}// 找秘书,秘书泡好端过来public String secretaryMake(){make();return "coffee";}}public static void main(String[] args) {// 老板想找助理干活,还想喝coffee,直接叫助理泡好过来coffee coffee = new coffee();coffee.secretaryMake();}
三、注意事项
- 迪米特法则的核心是降低类之间的耦合
- 但是要注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系。
7、合成复用
一、基本介绍
尽量使用合成/聚合的方式,而不是使用继承
违背原则代码
static class A {public void method1(){System.out.println("你调用了方法一");}public void method2(){System.out.println("你调用了方法二");}}// B类继承Astatic class B extends A{}public static void main(String[] args) {B b = new B();b.method1();b.method2();}
使用继承方式,B类继承了A类之后,就可以使用了A类中的两个方法,这样耦合性较高,不推荐
符合原则代码
/*** ---------------------------------组合方式---------------------------------------------*/static class B{A a = new A();public void method1(){a.method1();}public void method2(){a.method2();}}public static void main(String[] args) {B b = new B();b.method2();b.method1();}
/*** ---------------------------------依赖方式---------------------------------------------*/static class B{public void method1(A a){a.method1();}public void method2(A a){a.method2();}}
组合/聚合的方式,在B类里注入A,通过注入的A类来调用方法,耦合性低,易扩展。符合合成复用的原则
依赖方式,把A类作为参数传递到B类的两个方法中,从而达到调用A类的方法,耦合性低。符合合成复用的原则
核心思想
- 1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
- 2、针对接口编程,而不是针对实现编程
- 3、为了交互对象之间的松耦合设计而努力
设计模式——七大原则相关推荐
- Java面试之设计模式七大原则
最近项目不太忙,不怎么加班,正利用晚上时间好好学习学习设计模式,之前可能多多少少都用到过,但是有些还是很模糊,这下正好系统的学一下. 好了,话不多说,进入正题. 1.什么是设计模式? 软件工程中,设计 ...
- 第 2 章 设计模式七大原则
第 2 章 设计模式七大原则 1.设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战, 设计模式是为了让程序(软件),具有如下更好的 ...
- 设计模式——七大原则(附代码示例)
一. 设计模式概念 对接口编程而不是对实现编程:优先使用对象组合而不是继承 二. 设计模式总览 1. 创建型模式(Creational Patterns):(5) 单例(Singlet ...
- 图解设计模式-设计模式七大原则
Java设计模式 设计模式七大原则 设计模式的目的 编写软件过程中,程序员面临来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让 **程序(软件)**具有更好的 ...
- Day305.设计模式七大原则 -Java设计模式
七大设计原则 一.设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好的↓↓↓ 1. 代码重用 ...
- Java设计模式七大原则-单一职责原则
目录 概述:设计模式的目的 设计模式七大原则 单一职责原则 单一职责原则注意事项和细节 概述:设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等 ...
- 设计模式七大原则介绍
文章目录 1. 设计模式有哪些种类 2. 设计模式的目的 3. 设计模式七大原则 3.1. 单一职责原则 1. 基本介绍 2. 模拟场景 2. 接口隔离原则 1. 基本介绍 2. 模拟场景 3. 依赖 ...
- 设计模式七大原则知识概括
设计模式七大原则知识概括 设计模式的目的 设计模式七大原则 单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 设计原则核心思想 设计模式的目的 目的: ...
- JAVA设计模式七大原则
设计模式七大原则 设计模式目的 1.代码重用性 2.可读性 3.可读性 4.扩展性 5.可靠性 6.高内聚低耦合 七大原则 1.单一职责原则 一个类或方法中只做一件事情 2.接口隔离原则 一个类通过接 ...
最新文章
- 需要更换手机了:由 TensorFlow Lite 构建无人驾驶微型汽车
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
- 【VS+QT开发】获取本地网络信息小软件(C++)
- 思考:固态硬盘的普及,是否影响到了存储引擎的设计?
- 【转】正则基础之——捕获组(capture group)
- 角谷定理python输出变化过程,Python 100例——第十章----定理与猜想
- C++实例讲解Binder通信
- java foreach多线程_详解多线程入门案例与java8的并行流
- 【论文阅读】Computational Personality: A Survey 计算性格学综述
- 【视频】CCNA——小凡模拟器的简单介绍和使用
- java 路径规划_应用内路径规划的简单实现
- nacos指定外网ip
- 基于 IPO 经济理论模型对目前 ICO 的理论研究和分析
- html添加B站视频,iframe嵌入BiliBili视频方法B站视频外链
- 大学计算机课程实验指导书,《大学计算机基础》课程实验指导书.doc
- html地图周边搜索,高德地图API实现定位、地点搜索和周边搜索(H5/Vue/微信小程序)...
- 4.文本分类——textRNN模型
- 裴蜀定理(详细定义+应用+模板)
- 基于OCR识别引擎的识别表格文字并将结果以Excel电子表格的形式原样导出的Android客户端代码
- 算法(一) 算法初步
热门文章
- 上穿均线压力的大阳线特征:
- formality: 形式验证流程
- 大鱼吃小鱼算法java,瞬间高大上了!
- 【报名】榜单奖项+产业图谱+行业报告+线下论坛,2021年终金猿策划活动已开启...
- 华为鸿蒙系统能玩安卓游戏吗_华为正式发布鸿蒙系统 鸿蒙和安卓游戏数据是否互通...
- Microsoft Edge安装扩展插件
- i7 13700k核显性能 酷睿i713700k参数 i7 13700k功耗
- Android 通知屏幕亮起
- 离婚后发现对方婚内出轨,还能否要赔偿
- 哈拉德·柯施纳的狡猾