设计模式-开闭原则和迪米特法则

ops/2024/9/24 15:38:14/

开闭原则

基本介绍

  1. 开闭原则(Open Closed Principle) 是编程中最基础、最重要的设计原则
  2. 一个软件实体如类,模块和函数应该对扩展开放(对提供方)对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
  3. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  4. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则

应用实例

public class OCP {public static void main(String[] args) {// 使用看看存在的问题GraphEditor graphEditor = new GraphEditor();graphEditor.drawShape(new Rectangle());graphEditor.drawShape(new Circle());graphEditor.drawShape(new Triangle());}}// 这是一个用于绘图的类[使用方]
class GraphEditor {// 接收Shape对象,然后根据type,来绘制不同的图形public void drawShape(Shape s){if (s.mType == 1){drawRectangle(s);}else if (s.mType == 2){drawCircle(s);}else if (s.mType == 3){drawTriangle(s);}}// 绘制矩形public void drawRectangle(Shape r){System.out.println("绘制矩形");}// 绘制圆形public void drawCircle(Shape r){System.out.println("绘制圆形");}// 绘制三角形public void drawTriangle(Shape r){System.out.println("绘制三角形");}}// Shape类,基类
class Shape {int mType;
}
// 矩形类
class Rectangle extends Shape {public Rectangle() {super.mType = 1;}
}// 圆形类
class Circle extends Shape {public Circle() {super.mType = 2;}
}// 新增三角形
class Triangle extends Shape{public Triangle(){super.mType = 3;}
}

改进

public class OCP {public static void main(String[] args) {// 使用看看存在的问题GraphEditor graphEditor = new GraphEditor();graphEditor.drawShape(new Rectangle());graphEditor.drawShape(new Circle());graphEditor.drawShape(new Triangle());graphEditor.drawShape(new OtherGraphic());}}// 这是一个用于绘图的类[使用方]
class GraphEditor {// 接收Shape对象,调用draw方法 public void drawShape(Shape s){s.draw();}}// Shape类,基类
abstract class Shape {int mType;public abstract void draw();
}
// 矩形类
class Rectangle extends Shape {public Rectangle() {super.mType = 1;}@Overridepublic void draw() {System.out.println("绘制矩形");}
}// 圆形类
class Circle extends Shape {public Circle() {super.mType = 2;}@Overridepublic void draw() {System.out.println("绘制圆形");}
}// 新增三角形
class Triangle extends Shape{public Triangle(){super.mType = 3;}@Overridepublic void draw() {System.out.println("绘制三角形");}
}// 新增一个图形
class OtherGraphic extends Shape{public OtherGraphic(){super.mType = 4;}@Overridepublic void draw() {System.out.println("绘制其它图形");}
}

迪米特法则 

基本介绍

  1. 一个对象应该对其他对象保持最少的了解
  2. 类与类关系越密切,耦合度越大
  3. 迪米特法则(Demeter Principle)又叫最少知道原则,即-一个类对自已依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息
  4. 迪米特法则还有个更简单的定义:只与直接的朋友通信
  5. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

注意事项和细节

  1. 迪米特法则的核心是降低类之间的耦合
  2. 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有 依赖关系

http://www.ppmy.cn/ops/15371.html

相关文章

软件设计师-基础知识科目-计算题汇总1

1. 位运算: 略 2. 进制转换: 3. 计算内存存储容量: 前置概念:** 内存地址是16进制。 16进制后面的加上的字母H,表示数字为16进制。内存地址编址的单位是Byte,1K 1024B,1024用16进制表示为400H …

LabVIEW卡尔曼滤波技术

LabVIEW卡尔曼滤波技术 在现代航空导航中,高精度和快速响应的方位解算对于航空安全至关重要。通过LabVIEW平台实现一种卡尔曼滤波方位解算修正技术,以改善传统导航设备在方位解算中的噪声干扰问题,从而提高其解算精度和效率。通过LabVIEW的强…

windows SDK编程 --- 消息(3)

前置知识 一、消息的分类 1. 鼠标消息 处理与鼠标交互相关的事件,比如移动、点击和滚动等。例如: WM_MOUSEMOVE: 当鼠标在窗口客户区内移动时发送。WM_LBUTTONDOWN: 当用户按下鼠标左键时发送。WM_LBUTTONUP: 当用户释放鼠标左键时发送。WM_RBUTTOND…

面:go能不能手写一个简单的协程池?

最简单的想法是使用chan管道和wg也就是sync.WaitGroup这两个搭档来进行实现协程池 那么在chan管道中最简单的就是无缓冲的了 对于协程池有啥操作? 第一个要想到newPool 并且要明白,这个协程池是不是你叫他停他才能停,如果没说&#xff0c…

【氮化镓】GaN HEMT失效物理和可靠性

概述: 本文是一篇关于AlGaN/GaN基高电子迁移率晶体管(HEMTs)的失效物理和可靠性研究的综述文章,发表在2013年10月的《IEEE Transactions on Electron Devices》上。文章由Enrico Zanoni等人撰写,主要关注了影响栅极边缘和肖特基结的失效机制,并探讨了提高这些器件可靠性…

Java基础:简单工厂模式、工厂方法模式和抽象工厂模式综合概述

简单工厂模式、工厂方法模式和抽象工厂模式是面向对象设计中用来实现对象创建灵活性的三种不同形式的工厂模式。它们各自有其特点、适用场景及优缺点。以下是它们之间的区别以及对应的适用场景,以及示例说明: 简单工厂模式 定义: 简单工厂模…

YOLOv8常见水果识别检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频(常见水果识别(yolov8模型,从图像、视频和摄像头三种路径识别检测)_哔哩哔哩_bilibili) 资源包含可视化的水果识别检测系统,可识别图片和视频当中出现的六类常见的水果,包括&#xf…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 或 ./bin/mongod -f configs/mongodb.conf --repair查看报错信息…