面向对象的六大原则

面向对象六大原则详解 本文来说下面向对象六大原则 文章目录概述 概述 阅读详情

1、单一职责原则

简单的来说,一个类中应该是一组相关性很高的函数、数据的封装。对于一个具体的示例图片加载器,可以分为图片加载和图片缓存功能,为了满足单一职责,应该把各个功能独立出来,ImageLoader只负责图片的加载,而ImageCache只负责处理图片缓存的逻辑。而不应该一股脑的都封装在一个类中。正如上面所说,单一职责所表达的用意就是“单一”二字。对于两个完全不一样的功能就不应该放在一个类中。

2、开闭原则

软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。因为修改可能会将错误引入原本已经经过测试的旧代码中,破坏原有系统。因此,当软件需要变化时,我们应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。而遵循开闭原则的重要手段就是抽象。
比如ImageCache,一开始我们写了MemoryCache,后来因为需求,我们扩展了一个类DiskCache,最后,我们又扩展了一个双缓存类(如果MemoryCache没有找到,则去DiskCache中查找,如果还没有找到,则网络请求)。为了使扩展性、灵活性更高,MemoryCache、DiskCache、DoubleCache都实现了ImageCache接口,并且ImageLoader提供了一个setImageCache方法支持用户自定义缓存。
public interface ImageCache{
public Bitmap get(String  url);
public void put(String url,Bitmap bmp);
}
当然,在实际的开发中,只通过继承的方式来升级、维护原有系统只是一个理想化的愿景,因此,在实际的开发过程中,修改原有的代码、扩展代码往往是同时存在的。

3、里氏替换原则

里氏替换原则,简单的说就是所有引用基类的地方必须能够透明的使用其子类的对象。我们知道,面向对象的三大特点是继承、多态、封装。里氏替换原则就是依赖于继承和多态,只要父类出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者根本不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应,其实最终总结就是两个字:抽象。
开闭原则和里氏替换原则往往是生死相依、不弃不离的,通过里氏替换来达到对扩展开放,对修改关闭的效果。然而,两个原则都同时强调了一个OOP的重要特性 - 抽象,因此,在开发过程中运用抽象是走向代码优化的重要一步。

4、依赖倒置原则

依赖倒置原则指代了一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被倒置了(依赖抽象,而不依赖具体实现)。该原则有以下关键点:

  • 高层模块不应该依赖于底层模块,两者都应该依赖其抽象;
  • 抽象不应该依赖细节;
  • 细节应该依赖抽象;
在Java语言中,抽象就是指接口或者抽象类,细节就是实现类,实现接口或继承抽象类而产生的类就是细节。高层模块是调用端,底层模块就是具体的实现类。
依赖倒置原则在Java语言中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。其实一句话就可以概括:面向接口编程,或者说面向抽象编程。面向接口编程是面向对象精髓之一。

5、接口隔离原则

客户端不应该依赖它不需要的接口。另一种定义就是:类间的依赖关系应该建立在最小接口上。接口隔离原则将非常庞大、臃肿的接口拆分成了更小和更具体的接口,这样客户端只需要知道他们感兴趣的方法。说白了就是让客户端依赖的接口尽可能的小。试想一下,如果只需要关闭一个对象(比如FileOutputStream)时,它却暴露出了其他的接口函数,如write方法,这就使得更多的细节暴露在了客户端代码面前,不仅没有很好的隐藏实现,还增加了接口的使用难度。
以上五个原则作为面向对象的5个基本原则,最终可以化为这几个关键词:抽象、单一职责、最小化。

6、迪米特原则(最少知识原则)

一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少,类的内部如何实现与调用者或者依赖者没关系,调用者或依赖者只需要知道它需要的方法即可,其他的一概不用管。类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类的影响也越大。
详细讲解面向对象设计的六大原则 前言 其实,六大原则虽说是原则,但它们并不是强制性的,更多的是建议。遵照这些原则固然能帮助我们更好的规范我们的系统设计和代码习惯,但并不是所有的场景都适用,就例如接口隔离原则,在现实系统开发中,我们很难完全遵守一个模块一个接口的设计,否则业务多了就会出现代码设计过度的情况,让整个系统变得过于庞大,增加了系统的复杂度,甚至影响自己的项目进度,得不偿失啊。 所以,还是那句话,在合适的场景选择合适的技术! 六大原则 言归正传,这是我学习设计模式系列的第一篇文章,本文主要讲的是面向对象设计应该遵循的六. 阅读详情

相关推荐

JSON编程入门学习教材

JSON编程入门教材。 JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互

面向JSON编程

JSON { "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": 10021 }, "phoneNumbers": [ {

bill的博客 285

激光雷达接收芯片选型指南:APD、SiPM、SPAD阵列的优缺点对比

本文深入对比了激光雷达接收芯片APD、SiPM和SPAD阵列的核心技术原理与性能差异。APD作为线性模式工作的稳健选择,动态范围大;SiPM具备单光子探测和高增益优势;而SPAD阵列凭借像素级数字读出和集成TDC,在时间分辨率与系统集成度上领先。文章从灵敏度、时间精度、动态范围及系统成本等多维度剖析,为不同应用场景(如车载雷达、Flash LiDAR、消费电子)的芯片选型提供实战指南。

ik6789012的博客 656

内部对象(Data;JSON) 面向对象编程(原型对象)

内部对象 标准对象 typeof 123 "number" typeof '123' "String" typeof true "boolean" typeof NaN "number" typeof [] "object" typeof Math.abs "function" typeof undefined "undefined" Data var now = new Data(); now.fetFullYear(); //年 now.getMonth(); // 月 这里的月

weixin_45964083的博客 421

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 194

【UV打印机】RYPC打印软件教程(二)-软件界面概述

下图是控制软件的主操作界面.将喷绘机的操作规纳为四块,分别为参数设置,任务选择,打印控制,系统维护,对于日常打印而言,只需操作任务选择,打印控制。从而使汲及的操作相对较少,使得系统对普通用户而言简单易用.

Print World的专栏 3600

用面向对象的方式操作 JSON 甚至还能做四则运算 JSON 库

前言在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct;如果想要获取值就需要先做断言将其转换为 map 或者是切片再来获,会比较麻烦。decode,err:=gjson.Decode(`{"glossary":{"title":"exampleglossary","age"...

crossoverJie专栏 511

PICO+Unity MR空间网格开发实战:从零构建透视交互场景

本文详细介绍了使用PICO 4 Ultra与Unity引擎进行MR空间网格开发的完整实战流程。从环境准备、项目初始化、核心组件配置,到空间网格的生成、可视化与物理交互实现,手把手教你构建一个能识别真实环境并发射虚拟小球的透视交互场景。文章重点解析了PICO SDK中空间网格功能的关键配置与优化技巧,并提供了真机部署与调试的实用指南。

e3f4g5的博客 490

【JS笔记】JSON对象和面向对象编程

JS对象。面向对象编程

记录 641

四阶龙格库塔法求解一次常微分方程组(python实现)

之前在博客发布了关于使用四阶龙格库塔方法求解一次常微分方程组的文章,由于代码缺少具体的验证,部分朋友可能存在疑问,因此这里打算再重新写一篇博客来验证一下程序的正确性,另外,这里是使用python语言来实现的。

HelloWorldTM的博客 8543

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 310

面向对象六大原则

这六大原则是面向对象设计的重要基础,帮助开发者设计出高内聚、低耦合的系统。通过遵循这些原则,软件的结构会更加合理,扩展性、可维护性和复用性都将大大提升。在实际开发中,这些原则并非互相独立,而是相辅相成,应根据具体情况综合应用。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1047

YOLOv11-seg改进系列 | 引入CMTFNet(TGRS2023)+TransNeXt(CVPR2024)的C3k2_MSMHSA_CGLU模块,多尺度空洞注意力扩大感受野,增强复杂背景下

本文提出一种改进YOLOv11分割模型的C3k2_MSMHSA_CGLU模块,融合多尺度多头自注意力(MSMHSA)和卷积门控线性单元(CGLU)。MSMHSA通过多尺度空洞卷积提取不同感受野特征,生成跨尺度注意力,降低计算量同时保留全局上下文。CGLU采用卷积门控机制增强特征变换能力。实验表明,改进后模型参数量仅增加7.8%,GFLOPs增加4.2%,显著提升了多尺度目标检测性能,尤其适用于遥感图像等复杂场景。该模块有效解决了原始C3k2感受野有限、缺乏全局建模能力的问题。

qq_44224801的博客 200

Python面向对象六大原则

Python面向对象六大原则开闭原则(终极目标)单一原则依赖倒置原则组合复用原则里式替换原则迪米特法则 六大原则:开闭原则、单一原则、依赖倒置原则、组合复用原则、里式替换原则、迪米特法则 开闭原则(终极目标) 开闭原则是代码编写的的终极目标,而面向对象的其他五个原则全部都是为开闭原则服务的,以开闭原则为基本目标,通过不同方法来降低耦合度。 “开”指的是允许一个类甚至往大了说允许一个系统随时可以对自...

soap_fly的博客 2319

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

python面向对象六大原则_面向对象六大原则

这篇文章主要讲的是面向对象设计中,应该遵循的六大原则。只有掌握了这些原则,才能更好的理解设计模式。我们接下来要介绍以下6个内容。单一职责原则——SRP开闭原则——OCP里氏替换原则——LSP依赖倒置原则——DIP接口隔离原则——ISP迪米特原则——LOD0x01: 单一职责原则单一职责原则的定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情。如果一个类负责了方法M1...

weixin_39638468的博客 212

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

你应该掌握的-面向对象的六大原则

前言: 对于一个使用java语言的程序员而言,面向对象是编码时候的一条必要基准。理解好面向对象六大原则,对于你以后的编码是非常重要的。对于这六大原则,每个人的理解深度可能不同,绝大部分还是依据你自己的工作经验来理解这六大原则。对于我自己而言就是这样,刚开始工作的时候看这个懵懵懂懂,每过一年看一次面向对象的六大原则,都有不同的体会。所以在这我仅仅谈下这六大原则的概念以及实例,或许其中参杂着自己现阶

lxj_time的博客 666

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

面向对象六大设计原则

设计原则和设计模式的关系 面向对象的分析设计,需要遵循六大设计原则,这些设计原则大都会从思想上指导面向对象分析设计的正确方向,掌握这些原则能帮助我们更好的理解面向对象的概念,也能更好的理解设计模式。因为在实际开发中,也需要综合考虑业务需求、功能、实现难度、系统性能、时间与空间等很多方面的问题,所以很少做到完全遵守,总是在有意无意的违反一些或者是部分设计原则,这时便需要综合权衡其利弊。 设计模式是...

花开不败才是姿态 1083

面向对象的三大特征及六大原则

PHP面向对象 一、什么是面向对象? 面向对象:面向对象是现实世界中万事万物的一种抽象概述,即万物皆对象,我们在现实世界中接触的万事万物就是一个面向对象的过程;例如电脑、汽车、房子等就是一个对象,我们使用这些对象也是一个面向对象的过程。 二、面向对象的三大特征? 1.继承 定义:继承就是让一个类型对象获得另一个类型对象的属性的方法,并且支持多级继承。 理解:继承是指这样一种能力:它可以使用现有的类的所有功能,并无需重新编译原来的类的情况下对这些功能进行使用和扩展。一般通过继承创建的类称为“子类”或“派生类”

weixin_41965239的博客 3352
上一篇: Java 内存模型[部分概念,详细查阅书籍]
下一篇: 深入理解JVM - Java内存模型与线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值