敏捷软件开发 原则 模式 与实践 - OCP原则
最近在读BOB大叔的敏捷软件开发,特别是TDD那一章节,启示真的不少,从测试驱动开发,讲到驱动表明程序设计的意图,从设计意图讲到对象依赖的解耦,从解耦建立Mock对象。
其实是对每个模块都编写单元测试,因为很多时候公司的项目赶的紧,所以为每个单元模块都编写测试是一件非常困难的事情,但是这本书,从测试驱动设计意图的角度讲如何来设计程序确实是一个非常好的思路
今天我读了OCP那一张,因为那一章节是C++写的,所以我用Java写了一遍,方便阅读同一章节的同学学习观摩,借鉴的都是书中的思想,所以献丑
1 package pw.jonwinters.ocp; 2 public abstract class Shape implements Comparable<Shape> {//实现了Comparable接口,实际上可以实现一个Comparator 这样可以根据策略来选择是实现 倒序 还是 顺序 3 public abstract void draw();//抽象方法 打印图形名称 4 public abstract int area(); 5 public abstract int getPriority();//设置优先级 6 public abstract void setPriority(int priority);//获得优先级 7 8 9 public int compareTo(Shape o) { 10 // TODO Auto-generated method stub 11 return (this.getPriority() - o.getPriority());//为Shape类实现Compareto方法 12 } 13 }
1 package pw.jonwinters.ocp; 2 3 public class Circle extends Shape { 4 5 private int priority=0; 6 @Override 7 public void draw() { 8 // TODO Auto-generated method stub 9 System.out.println("I am Circle"); 10 } 11 12 @Override 13 public int area() { 14 // TODO Auto-generated method stub 15 return 10; 16 } 17 18 19 20 @Override 21 public int getPriority() { 22 // TODO Auto-generated method stub 23 return this.priority; 24 }
1 package pw.jonwinters.ocp; 2 3 public class Square extends Shape { 4 5 private int priority=0; 6 @Override 7 public void draw() { 8 // TODO Auto-generated method stub 9 System.out.println("I am Square"); 10 } 11 12 @Override 13 public int area() { 14 // TODO Auto-generated method stub 15 return 0; 16 } 17 18 @Override 19 public int getPriority() { 20 // TODO Auto-generated method stub 21 return this.priority; 22 } 23 24 25 26 @Override 27 public void setPriority(int priority) { 28 // TODO Auto-generated method stub 29 this.priority=priority; 30 } 31 32 }
1 package pw.jonwinters.ocp; 2 3 public class SortShape { 4 private static Class<?> shapeList[] = {Circle.class,Square.class};//这里采用静态方法 5 public static void setPriority(Shape shape){ 6 for (int i = 0 ; i < shapeList.length;i++ ){ 7 if (shape.getClass().equals(shapeList[i]))//获得对象的Class对象 比较是否与数组的Class对象相同 8 shape.setPriority(i);//设置优先级 9 } 10 } 11 }
1 package pw.jonwinters.ocp; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 7 import org.junit.Before; 8 import org.junit.Test; 9 10 public class ShapeTest { 11 private List<Shape> shapeList; 12 @Before 13 public void beforeTest(){ 14 shapeList = new ArrayList<Shape>(); 15 shapeList.add(new Circle()); 16 shapeList.add(new Square()); 17 shapeList.add(new Circle()); 18 shapeList.add(new Circle()); 19 shapeList.add(new Square()); 20 shapeList.add(new Circle()); 21 shapeList.add(new Square()); 22 } 23 24 @Test 25 public void test(){//单元测试 26 for(Object shape : shapeList.toArray()){//先用SortShape给每个Shape对象赋值priority 27 SortShape.setPriority((Shape) shape); 28 } 29 Collections.sort(shapeList);//排序 30 for(Object shape : shapeList.toArray()){ 31 ((Shape)shape).draw();//打印 32 } 33 } 34 }