`

设计模式六大原则(1):单一职责原则

 
阅读更多
来自手机的一个java学习宝典的APP,代码和解释都是自己手打后实践了下!

package study.test.legon;

import java.util.Scanner;

public class AcountYear {

	/**
	 * 设计模式的六大原则,单一职责原则
	 * 题目:输入某年某月某日,判断这一天是这一年的第几天
	 */
	public static void main(String[] args) {
		int year, month,day;
		int days = 0;
		int e = 0;
		int d = 0;
		
		do{
			System.out.println("输入某年");
			year = printNum();
			System.out.println("输入某月");
			month = printNum();
			System.out.println("输入某天");
			day = printNum();
			
			//判断时间的输入正确与否
			if(year<0||month<0||day<0||month>12||day>31){
				System.out.println("时间输入错误,请重新输入");
				e = 1;
			}
			//判断2月份的时间是否输入错误,闰年29,平年28
			/**
			 * 闰年:①、普通年能被4整除且不能被100整除的为闰年。
			 *      ②、世纪年能被400整除的是闰年
			 */   
			//这是闰年,那么2月只有29天
			if(year%400==0||(year%4==0&&year%100!=0)){
				if(month==2&&day>29){
					System.out.println("2月份的时间输入错误");
					e = 1;
				}
			}else{
				if(month ==2&&day>28){
					System.out.println("2月份的时间输入错误");
					e = 1;
				}
			}
		}while(e==1);
		
		//计算是这一年的第几天
		for(int i=0;i<month;i++){
			switch (i) {
			/**
			 * 判断月份30和31天的诀窍,我记得老妈教过我,7前单月大,7后单月小,所以1,3,5,7,8,10,12这几月是31天
			 * 然后4,6,9,11这几月是30天
			 * 2月依据闰年,平年来判断
			 */
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				days = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				days = 30;
				break;
			case 2:
				if((year%400==0)||(year%4==0&&year%100!=0)){
					days = 29;
				}else{
					days = 28;
				}
				break;
			}
			d = d + days;
		}
		System.out.println(year+"-"+month+"-"+day+"是这一年的第"+(d+day)+"天");
	}
	
	public static int printNum(){
		int num ;
		Scanner  scanner = new Scanner(System.in);
		num = scanner.nextInt();
		return num;
	}
}

/**
 * 定          义:不能存在多余一个导致类变更的原因,通俗的说,即一个类只负责一项职责.
 * 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而修改T的时,
 *         有可能造成原本运行正常的职责P2发生故障
 * 解决方案:遵循单一职责原则.分别建立两个类T1,T2来完成职责P1,P2!这样在修改T1时不会影响到P2
 * 
 * 单一原则比较简单,所以很多人不屑一顾,但是经验丰富的程序员也会有时候违背这一原则,因为有时候职责扩散
 * 就好比原本一个职责P被细分化成了P1和P2
 * 比如:类T只负责职责P,这样设计符合单一职责原则,后来由于某种原因,可能程序员境界提高,可能需求改变,需要把
 * P分化成P1和P2了,那么按照单一职责原则,需要创建一个T1和T2.但是程序写好的情况下这么做太浪费时间,.所以
 * 简单的修改T,用它来负责两个职责是个比较不错的选择,虽然这样做有背于单一职责原则.
 * 这样做的风选在于职责的扩散不稳定,因为我们没有想到职责P在未来可能会扩展到P1,P2.....Pn,所以记住,在职责
 * 扩散到我们无法控制的程度之前,立刻对代码进行重构
 * 
 * 举例说明:
 * 用一个类来描述动物呼吸的场景
 */
class Animal{
	public void breathe(String animal){
		System.out.println(animal+"呼吸空气");
	}
}
class client{
	public static void main(String[] args){
		Animal animal = new Animal();
		animal.breathe("牛");
		animal.breathe("羊");
		animal.breathe("猪");
	}
}

/**
 * 结果可想而知,牛/羊/猪呼吸空气
 * 程序上线后,发现问题了,并不是所有的动物都呼吸空气,比如鱼呼吸水.
 * 修改时遵循单一职责原则,需要将Animal细分为陆生生物Terrestrial和水生生物Aquatic 
 */
class Terrestrial{
	public void breathe(String animal){
		System.out.println(animal+"呼吸空气");
	}
}
class Aquatic{
	public void beathe(String animal){
		System.out.println(animal+"呼吸水");
	}
}
class client_{
	public static void main(String[] args){
		Terrestrial terrestrial = new Terrestrial();
		terrestrial.breathe("牛");
		terrestrial.breathe("羊");
		terrestrial.breathe("猪");
		
		Aquatic quatic = new Aquatic();
		quatic.beathe("鱼");
	}
}
/**
 * 这样修改花销很大,除了将原来的类Animal分解之外,还需要修改客户端.而直接将
 * 修改Animal类虽然违背了单一职责原则,但是花销很小,代码如下:
 */
class Animal_{
	public void beathe(String animal){
		if("鱼".equals(animal)){
			System.out.println(animal+"呼吸水");
		}else{
			System.out.println(animal+"呼吸空气");
		}
	}
}

/**
 * 这样做client只需要加一句animal.breathe("鱼")这样做很简单,但是存在很大的隐患.如果哪一天鱼要分为淡水鱼和呼吸
 * 海水的海水鱼,那么又要修改animal的breathe方法,而对于这个修改可能会对调用猪牛羊的也造成风选,也许哪一天变成
 * 猪牛羊也呼吸水了,这种修改方式违背了单一职责原则,虽然改起来简单那,但是隐患很大,还有一种修改方式
*/
class Animal__{
	public void beathe1(String animal){
		System.out.println(animal+"呼吸空气");
	}
	public void beathe2(String animal){
		System.out.println(animal+"呼吸水");
	}
}
/**
 * 这样修改了 只需要在client加一句animal.breathe2("鱼"),虽然这样也违背了单一职责原则,但是在方法级别上是符合
 * 单一职责原则的,因为并没有动原有的方法的代码.这三种都各有优缺点,但是在实际中采用哪一种还真是比较难说.
 * 原则是:只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法足够少,才能在方法级别上违反单一职责原则
 * 
 * 例如上面的例子,因为它很简单,所以无论在代码级别上还是方法级别上违反了单一职责原则,都不会造成太大的影响.但是在实际
 * 应用中的类都要负责的多,一旦发生职责扩散而需要修改类时,除非这个类本身非常简单,否则还是要遵循单一职责原则的好!
 * 
 * 下面总结单一职责原则的有点:
 *       可以降低类的负责度,一个类只负责一个职责,其逻辑肯定要比负责多项职责的简单的多
 *       提高类的可读性,提高系统的可维护性
 *       变更引起的风险降低,变更时必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响
 *       需要说明一点的是单一职责原则不只是对面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则
 */


分享到:
评论

相关推荐

    设计模式六大原则与类的六种关系

    设计模式六大原则与类的六种关系 设计模式六大原则是软件设计中遵循的一些基本原则,目的是为了使软件设计更加灵活、可维护和可扩展。六大原则分别是:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、...

    设计模式六大原则 设计模式详解

    在本文中,我们将深入探讨设计模式的六大原则,这些原则是指导我们编写高质量、可维护和可扩展代码的关键。首先,我们将关注其中的一个重要原则——单一职责原则(Single Responsibility Principle,SRP)。 单一...

    设计模式之六大原则详解,Markdown笔记

    详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。

    php 设计模式六大原则

    php 设计模式六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 word版

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    1.单一职责原则: 不要存在多于一个导致类变更的原因 2.里氏替换法则:子类可以扩展父类的功能,但不能改变父类原有的功能 3.依赖倒置原则:面向接口编程 4.接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对...

    设计模式6大原则.doc

    ### 设计模式六大原则之单一职责原则详解 #### 原则定义 单一职责原则(Single Responsibility Principle, SRP)是面向对象设计的基本原则之一,它指出一个类应该仅有一个引起其变化的原因。换句话说,一个类应该专注...

    设计模式六大原则

    1. 单一职责原则(Single Responsibility Principle, SRP) 这个原则强调一个类或模块应该只有一个引起其变化的原因。如果一个类承担了多个职责,那么这些职责之间可能会相互影响,导致代码的脆弱性。例如,在动物...

    单一职责模式例子。

    在软件设计领域,单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的六大原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这个原则强调一个类或者模块应当...

    设计模式六大原则.doc

    设计模式六大原则是软件开发中不可或缺的指导方针,它们旨在提升代码的可维护性、可扩展性和可重用性。以下是对这些原则的详细解释: 1. 单一职责原则(Single Responsibility Principle, SRP): 这个原则强调一个...

    设计模式+六大原则pdf

    由孙玉山主编的“设计模式+六大原则”PDF,无疑是深入理解和掌握这些概念的宝贵资源。这本书不仅涵盖了全部的设计模式,还结合了软件体系结构的题目案例,以及源码分析,帮助读者将理论与实践相结合。 首先,我们来...

    JAVA 24种设计模式介绍与6大设计原则.pdf

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即类中的方法都应该聚集在一个单一的功能上。 2. 里氏替换原则(Liskov Substitution Principle, LSP):子类应该...

    23种 设计模式---面向对象的基本原则

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这意味着一个类应该只做一件事情,这样可以提高代码的可维护性和可读性。 2. 开放封闭原则(Open-Closed ...

    设计模式和原则(很实用)

    1. **单一职责原则**:每个类或模块应只有一个明确的责任。这有助于减少类之间的耦合度,提高代码的可读性和可测试性。 2. **控制器**:引入一个对象来协调多个对象之间的交互,避免过度耦合。这个对象被称为控制器...

    GOF的23种设计模式,及设计模式的六大原则

    设计模式的六大原则: 1. **开闭原则**:对扩展开放,对修改关闭,意味着在保持软件原有功能的基础上,可以方便地扩展新功能。 2. **里氏代换原则**:子类必须能够替换掉它们的基类,保证软件组件的可替换性,确保...

    设计模式之六大原则

    ### 设计模式之六大原则详解 #### 一、单一职责原则 (SRP) **定义**: 单一职责原则(SRP, Single Responsibility Principle)指出,一个类应该仅有一个引起它变化的原因,换句话说,一个类只应负责一项职责。 **...

    设计模式与设计原则.pdf

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这意味着一个类应该只有一个职责或功能。 2. 里氏替换原则(Liskov Substitution Principle, LSP):子类应当可以...

    24种设计模式介绍与6大设计原则

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该仅有一个引起它变化的原因。 2. 里氏替换原则(Liskov Substitution Principle, LSP):子类应该能够替换掉它们的基类。 3. 依赖倒置原则...

    设计模式六大原则 .docx

    设计模式六大原则是软件开发中不可或缺的指导原则,它们旨在提高代码的可维护性、可扩展性和可重用性。以下是对这六个原则的详细解释: 1、单一职责原则(SRP) 单一职责原则指出,一个类或模块应只负责一项功能。...

Global site tag (gtag.js) - Google Analytics