设计模式:设计模式(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><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详解》
原文地址:http://blog.csdn.net/androidolblog/article/details/45033311