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

一、什么是设计模式

设计模式:设计模式(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详解》

设计模式六大原则

相关文章
相关标签/搜索