java 单一职责原则_设计模式之单一职责原则

对类来说,即一个类应用只负责一项职责,如类A负责两个不同的职责:职责1,职责2.当职责1需求变更时,可造成职责2执行错误,所以需要将类A的粒度分解为A1,A2.

降低类的复杂度,一个类只负责一项职责

提高类的可读性,可维护性

降低变更引起的风险

通常情况下,我们应该遵守单一职责原则,只在逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中方法数量足够少时,可以在方法级别保持单一职责原则即可package www.perwrj.principle.SRP;

/**

* 方案一:不遵守单一职责原则

* @author wangruijie

*

*/

public class SingleResponsibilityDemo1 {

public static void main(String[] args) {

Vehicle vehicle = new Vehicle();

vehicle.run("汽车");

vehicle.run("飞机");

vehicle.run("潜艇");

/*

* 汽车在跑

飞机在跑

潜艇在跑

*/

}

}

/**

* 交通工具类

* @author wangruijie

*

*/

class Vehicle{

/**

* run方法中,违反单一职责原则

* 解决方案很简单,根据交通工具运行的方式不同,分解成不同的类即可

* @param vegicle

*/

public void run(String vegicle) {

System.out.println(vegicle + "在跑");

}

}

package www.perwrj.principle.SRP;

/**

* 方案二:遵守了单一职责原则

* 但这样花销很大,要将类分解,同时修改客户端

* 改进:直接修改Vehicle类

* @author wangruijie

*

*/

public class SingleResponsibilityDemo2 {

public static void main(String[] args) {

RoadVehicle roadVehicle = new RoadVehicle();

roadVehicle.run("汽车");

AirVehicle airVehicle = new AirVehicle();

airVehicle.run("飞机");

WaterVehicle waterVehicle = new WaterVehicle();

waterVehicle.run("潜艇");

}

}

/**

* 地上跑的

* @author wangruijie

*

*/

class RoadVehicle{

public void run(String vehicle) {

// TODO Auto-generated method stub

System.out.println(vehicle + "地上跑的");

}

}

/**

* 天上飞的

* @author wangruijie

*

*/

class AirVehicle{

public void run(String vehicle) {

// TODO Auto-generated method stub

System.out.println(vehicle + "天上飞的");

}

}

/**

* 在水中跑

* @author wangruijie

*

*/

class WaterVehicle{

public void run(String vehicle) {

// TODO Auto-generated method stub

System.out.println(vehicle + "在水中跑");

}

}

package www.perwrj.principle.SRP;

/**

* 方案三

* 这种修改方法没有对原来类做大的修改,只是增加了方法。

* 没有在类级别上遵守单一职责原则

* 在方法级别上遵守单一职责原则

* @author wangruijie

*

*/

public class SingleResponsibilityDemo3 {

public static void main(String[] args) {

Vehicle2 vehicle2 = new Vehicle2();

vehicle2.run("汽车");

vehicle2.runAir("飞机");

vehicle2.runWater("潜艇");

}

}

/**

* 交通工具类

* @author wangruijie

*

*/

class Vehicle2{

/**

*

* @param vegicle

*/

public void run(String vegicle) {

System.out.println(vegicle + "在地上跑");

}

public void runAir(String vegicle) {

System.out.println(vegicle + "在天上跑");

}

public void runWater(String vegicle) {

System.out.println(vegicle + "在水里跑");

}

}

内容来源于网络如有侵权请私信删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript 2.0 正式发布

9 月 22 日,TypeScript 2.0 正式发布了。 TypeScript 是微软开发的开源的编程语言,主要负责人是 C# 之父 Anders Hejlsberg。 TypeScript 成功将 JavaScript 的潜能与静态类型结合了起来,而且编译为 JavaScript。编译时类型检查可以避免很多潜…

Tomcat server.xml配置示例

转载自 Tomcat server.xml配置示例几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上,其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的,使得软件设计者或架构师可以在容器运行时或销毁时&am…

日志-周报-月报(2019年2月)

20190203 1.马氏距离找公式 2.ruby先不看吧,先java学着到联通没办法在写ruby 3.舔狗,ppt,进公司考智商,升职靠情商。 4.看德哥看了一天 5.没了 6.联通调岗做销售,华为不续签合同,ppt文化哪家都一样&a…

怎么用php配合js编写动态页面_JavaScript_JavaScript教程:用JS脚本实现Web页面信息交互范例,要实现动态交互,必须掌握有 - phpStudy...

要实现动态交互,必须掌握有关窗体对象(Form)和框架对象(Frames)更为复杂的知识。三、范例下面我们演示通过点击一个按钮(red)来改变窗口颜色,点击“调用动态按钮文档”调用一个动态按钮文档。test8_1.htm//原来的颜色document.bgColor"blue";d…

SignalR的性能监测与服务器的负载测试

前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的负载测试 我们开发任何一个应用,他的性能监测是很重要的参考数据,关系着我们后期优化,更新,改动..等等... SignalR作为…

在Tomcat配置JNDI数据源的三种方式

转载自 在Tomcat配置JNDI数据源的三种方式在我过去工作的过程中,开发用服务器一般都是Tomcat,数据源的配置往往都是在applicationContext.xml中配置一个dataSource的bean,然后在部署时再修改JNDI配置。我猜是因为Tomcat的配置需要改配置文件&#xff0…

毕业设计word 表格标题 图表标题

图一模一样 生成目录 ************************************************************************************************************************* 生成表目录和图目录 *********************************************************************************************…

php打印 二维数组,PHP中遍历二维数组_以不同形式的输出操作实例

//定义二维索引数组$arr array(array("101","李军","男","1976-02-20","95033"),array("103","陆君","男","1974-06-03","95031"),array("105","匡明&q…

Ubuntu 16.04下ASP.NET Core+ MySql + Dapper在 Jexus、nginx 下的简单测试

一、环境及工具 1、服务器 VirtualBox5.1.4 安装 Ubuntu Server 16.04 amd64MySql Ver 14.14 Distrib 5.6.21Jexus 5.8.1nginx 1.10.0dotnet core 1.0.0-preview2-003121supervisor 3.2.1 2、开发环境 VS2015 Update 3DotNetCore.1.0.0-VS2015Tools.Preview2.0.1.exe 3、测试工…

jsp九大隐藏对象

转载自 jsp九大隐藏对象jsp内置对象(隐藏对象):不加声明和创建就可以在jsp页面脚本中使用的成员对象。 内置对象类型作用域requestjavax.servlet.http.HttpServletRequestrequestresponsejavax.servlet.http.HttpS…

新闻发布项目——数据库脚本(直接导入即可)

数据库sql servel 2012版本,以下是脚本: USE [master] GO /****** Object: Database [newsDB] Script Date: 2016/11/24 19:48:46 ******/ CREATE DATABASE [newsDB]CONTAINMENT NONEON PRIMARY ( NAME NnewsDB, FILENAME NE:\第二期\第六本书使…

最新版Intellij IDEA视频教程 20170814

01课程介绍和软件安装.avi 02Intellij IDEA常用快捷键1132.avi 03Intellij IDEA安装Tomcat和Maven.avi 04Intellij IDEA使用Maven Helper插件分.avi 05Intellij IDEA中Git安装和使用.avi 06Intellij IDEA连接MySQL数据库.avi 07Intellij IDE使用GsonFormat转化json.avi …

Docker容器环境下ASP.NET Core Web API应用程序的调试

本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试。在自己做实验的过程中也碰到了一些问题,经过一些测试和搜索资料,基本解决了这些问题&#xf…

php 查看spl,PHP使用标准库spl实现的观察者模式示例

本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下:前面使用纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者&…

深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会

转载自 深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会自定义标签,顾名思义,就是自己定义的标签。那么我们为什么要自己定义一些标签呢? 我们知道,如果要在JSP中获取数据我们可以采用通过JSP的隐式对象request来…

ps查看所有php进程,ps命令就是最基本进程查看命令

1、ps是什么?要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等…

如何测试微信应用号

每一次微信的动作都是商机,而随着微信应用号的即将面世,微信应用号的开发和测试又会成为一股新的风向。 其实经常有人问到微信服务号或者微信订阅号怎么测试的相关内容,可能总觉得比较缺乏技术含量不太想说,这次看了下应用号&…

git 拉代码

git clone 。。 拉取代码master git clone -b 分支名 。。。 拉取分支名 git——更新分支、提交代码、切换分支、合并分支 还是直接贴教程吧:https://git-scm.com/book/zh/v2 如何把本地idea上的项目上传到github上:https://www.cnblogs.com/…

javaweb学习总结(二十四)——jsp传统标签开发

转载自 javaweb学习总结(二十四)——jsp传统标签开发一、标签技术的API 1.1、标签技术的API类继承关系二、标签API简单介绍 2.1、JspTag接口JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法。JspTag接口有Tag…

二级导航 sql php,帝国cms栏目导航调用之SQL语句调用一级栏目和二级栏目的方法...

帝国cms调用一级栏目及下面的二级栏目调用方法如下&#xff1a;SQL语句<?php $ecms_bq_sqlsys_ReturnEcmsLoopBq("select * from [!db.pre!]enewsclass where bclassid0 order by myorder limit 6",14,24,0);$bqno0;while($bqr$empire->fetch($ecms_bq_sql)){…