一、什么是设计模式
设计模式:设计模式(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详解》