设计模式六大原则之单一职责原则

前端之家收集整理的这篇文章主要介绍了设计模式六大原则之单一职责原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、什么是设计模式

设计模式:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。由此可见,设计模式不是代码复用而是经验复用。是代码设计的经验总结。


设计模式的六大原则:【单一职责、里氏替换、依赖倒置、接口隔离、迪米特法则、开闭】


23中常用的设计模式:

【单例模式、工厂模式、抽象工厂模式、模板模式、代理模式、建造者模式、原型模式、中介者模式、

命令模式、装饰模式、策略模式、责任链模式、适配模式、迭代器模式、组合模式、观察者模式、备忘录模式、

门面模式、状态模式、桥梁模式、解析器模式、享元模式、访问者模式】


二、单一职责原则简要介绍


单一职责原则:

Single Responsibility Principle,简称是SRP。SRP原则的解释是:There should never be more than one reason for a class to change。有且仅有一个原因引起类的改变。也就是一个类只负责一项职责。

单一职责原则,使类的职责明确,要扩展功能或者修改某些功能的时候,仅需修改负责该职责的类,而不用大动干戈。

下面以种花为例子。实现种植者,种红花,给红花浇浇水。种黄花,给黄花浇浇水过程。

种花的大概过程是,种植者,挖坑,种花,填土。适当的时候浇水施肥。

抽象后,类图表示如下:


代码如下:

plantStep 接口代码:种花流程

<span style="font-size:14px;">package dim.SRP.simples;

public interface PlantStep {
/**
 * 挖个坑,用来种东西
 */
	public void digHole();
	/**
	 * 种东西
	 */
	public void putPlant(Plant p );
	/**
	 * 填土
	 */
	public void coverSiol();
	/**
	 * 浇水
	 * @param Name  指定给那棵植物浇水
	 */
	
	public void watering();
	/**
	 * 施肥
	 * @param Name 指定给那棵植物施肥
	 */
	public void fetilizing();
	
	public Plant findThePlant(Plant p);
}
</span>


Planter 实现PlantStep 接口:实现之后,种植者可以调用步骤种花。
<span style="font-size:14px;">package dim.SRP.simples;

public class Planter implements PlantStep {
          Plant plant;
          
          public Planter( ) {
			// TODO Auto-generated constructor stub
        	   
		}
	@Override
	public void digHole() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void putPlant(Plant plant) {
		// TODO Auto-generated method stub
		this.plant=plant;
		System.out.println("what you planted is  "+this.plant.getName());
	}

	@Override
	public void coverSiol() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void watering() {
		// TODO Auto-generated method stub
		System.out.println("watering  "+this.plant.getName());
	}

	@Override
	public void fetilizing() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public Plant findThePlant(Plant p) {
		// TODO Auto-generated method stub
		this.plant=p;
		return this.plant;
	}

}
</span>

花是植物,植物的简单接口是:
<span style="font-size:14px;">package dim.SRP.simples;

import java.awt.Color;

public interface Plant {
	/**
	 * 设置植物的名字
	 * @param Name
	 */
	public void setName(String Name);
	
	public String getName();
	/**
	 * 设置植物高度
	 * @param Hight
	 */
          public void setHight(float Hight);
          /**
           * 设置植物颜色
           * @param color
           */
          public void setColor(Color color);
          /**
           * 设置植物的重量
           * @param weight
           */
	      public void setWeight(int weight);
	      

}
</span>

红花:
<span style="font-size:14px;">package dim.SRP.simples;

import java.awt.Color;

public class RedFlower implements Plant{
         private String NameOfF="";
         
     	@Override
    	public void setName(String Name) {
    		// TODO Auto-generated method stub
    		this.NameOfF=Name;
    	}

    	@Override
    	public String getName() {
    		// TODO Auto-generated method stub
    		return NameOfF;
    	}
	@Override
	public void setHight(float Hight) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setColor(Color color) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setWeight(int weight) {
		// TODO Auto-generated method stub
		
	}



 
	
	

}
</span>

黄花:
<span style="font-size:14px;">package dim.SRP.simples;

import java.awt.Color;

public class YellowFlower  implements Plant {

	String flowerName="";
	@Override
	public void setName(String Name) {
		// TODO Auto-generated method stub
		flowerName=Name;
	}

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return flowerName;
	}

	@Override
	public void setHight(float Hight) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setColor(Color color) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setWeight(int weight) {
		// TODO Auto-generated method stub
		
	}

}
</span>

测试类:
<span style="font-size:14px;">package dim.SRP.simples;

public class TestPlantClass {
 
	public  static  void main(String[] args) {
		RedFlower redFlower=new RedFlower();
		redFlower.setName("red flower");
		
		Planter planter=new Planter();
		//种红花,然后浇浇水。
		planter.digHole();
		planter.putPlant(redFlower);
		planter.coverSiol();
		planter.watering();
		
		YellowFlower yellowFlower=new YellowFlower();
		yellowFlower.setName("Yellow flower");
		//种黄花,然后浇浇水
		planter.findThePlant(yellowFlower);
		planter.digHole();
		planter.putPlant(yellowFlower);
		planter.coverSiol();
		planter.watering();
		//指定给红花浇水
		planter.findThePlant(redFlower);
		planter.watering();
	}
}</span>


打印结果:

what you planted is red flower
watering red flower
what you planted is Yellow flower
watering Yellow flower
watering red flower

看来运行对了,但是这个抽象有很多问题,需要进一步向上抽象。比如,种植者当中,不是每个人都是种花浇水。应该是有的种花,有的浇水。而且花种完了,不用再种,只剩下浇水,施肥等。得想办法抽象出一个浇水施肥的种植者CarePlanter。

抽象类图如下:


上面的施肥浇水种植者,职责单一,负责花的照料工作。同样,要其他的裁剪花草,采摘果子的可以一一拓展。

SRP原则:有且仅有一个原因引起类的改变。也就是一个类只负责一项职责。


不足之处、望多多指教、共同进步!


相关链接设计模式六大原则之里氏替换原则


参考资料:

《设计模式之禅》

《HeadFirst》

《StartUML详解》

设计模式六大原则

猜你在找的设计模式相关文章