最近在读BOB大叔的敏捷软件开发,特别是TDD那一章节,启示真的不少,从测试驱动开发,讲到驱动表明程序设计的意图,从设计意图讲到对象依赖的解耦,从解耦建立Mock对象。

其实是对每个模块都编写单元测试,因为很多时候公司的项目赶的紧,所以为每个单元模块都编写测试是一件非常困难的事情,但是这本书,从测试驱动设计意图的角度讲如何来设计程序确实是一个非常好的思路

今天我读了OCP那一张,因为那一章节是C++写的,所以我用Java写了一遍,方便阅读同一章节的同学学习观摩,借鉴的都是书中的思想,所以献丑

 package pw.jonwinters.ocp;
public abstract class Shape implements Comparable<Shape> {//实现了Comparable接口,实际上可以实现一个Comparator 这样可以根据策略来选择是实现 倒序 还是 顺序
public abstract void draw();//抽象方法 打印图形名称
public abstract int area();
public abstract int getPriority();//设置优先级
public abstract void setPriority(int priority);//获得优先级 public int compareTo(Shape o) {
// TODO Auto-generated method stub
return (this.getPriority() - o.getPriority());//为Shape类实现Compareto方法
}
}
 package pw.jonwinters.ocp;

 public class Circle extends Shape {

     private int priority=0;
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("I am Circle");
} @Override
public int area() {
// TODO Auto-generated method stub
return 10;
} @Override
public int getPriority() {
// TODO Auto-generated method stub
return this.priority;
}
 package pw.jonwinters.ocp;

 public class Square extends Shape {

     private int priority=0;
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("I am Square");
} @Override
public int area() {
// TODO Auto-generated method stub
return 0;
} @Override
public int getPriority() {
// TODO Auto-generated method stub
return this.priority;
} @Override
public void setPriority(int priority) {
// TODO Auto-generated method stub
this.priority=priority;
} }
 package pw.jonwinters.ocp;

 public class SortShape {
private static Class<?> shapeList[] = {Circle.class,Square.class};//这里采用静态方法
public static void setPriority(Shape shape){
for (int i = 0 ; i < shapeList.length;i++ ){
if (shape.getClass().equals(shapeList[i]))//获得对象的Class对象 比较是否与数组的Class对象相同
shape.setPriority(i);//设置优先级
}
}
}
 package pw.jonwinters.ocp;

 import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import org.junit.Before;
import org.junit.Test; public class ShapeTest {
private List<Shape> shapeList;
@Before
public void beforeTest(){
shapeList = new ArrayList<Shape>();
shapeList.add(new Circle());
shapeList.add(new Square());
shapeList.add(new Circle());
shapeList.add(new Circle());
shapeList.add(new Square());
shapeList.add(new Circle());
shapeList.add(new Square());
} @Test
public void test(){//单元测试
for(Object shape : shapeList.toArray()){//先用SortShape给每个Shape对象赋值priority
SortShape.setPriority((Shape) shape);
}
Collections.sort(shapeList);//排序
for(Object shape : shapeList.toArray()){
((Shape)shape).draw();//打印
}
}
}

敏捷软件开发 原则 模式 与实践 - OCP原则的更多相关文章

  1. 敏捷软件开发:原则、模式与实践——第9章 OCP:开放-封闭原则

    第9章 OCP:开放-封闭原则 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 9.1 OCP概述 遵循开放-封闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(open f ...

  2. 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

    第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...

  3. 【Scrum】-NO.40.EBook.1.Scrum.1.001-【敏捷软件开发:原则、模式与实践】- Scrum

    1.0.0 Summary Tittle:[Scrum]-NO.40.EBook.1.Scrum.1.001-[敏捷软件开发:原则.模式与实践]- Scrum Style:DesignPattern ...

  4. 敏捷软件开发:原则、模式与实践——第14章 使用UML

    第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...

  5. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

    第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...

  6. 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则

    第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...

  7. 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

    第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...

  8. 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则

    第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的 ...

  9. 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)

    Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...

随机推荐

  1. 初识python(1)

    1.python简介 Python是一种面向对象.直译式计算机程序语言.也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定. Python语法简捷而清晰,具有丰富和强大的类库.它 ...

  2. Step by step configuration of Outgoing Emails from SharePoint to Microsoft Online

    First of all your SharePoint server should be added to Microsoft online safe sender list, so that Sh ...

  3. 推荐几个优秀的java爬虫项目

    java爬虫项目   大型的: Nutch apache/nutch · GitHub 适合做搜索引擎,分布式爬虫是其中一个功能. Heritrix internetarchive/heritrix3 ...

  4. Android——五大布局

    Android的五大布局分为: 线性布局 相对布局 帧布局 绝对布局 表格布局 一.线性布局 线性布局在开发中使用最多,具有垂直方向与水平方向的布局方式 通过设置属性"android:ori ...

  5. Objective-C之集合对象的内存管理

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. 我眼中的自己ps:自我介绍

    我是一个理科生,学的是计算机科学与技术专业,目前在桂林理工大学信息科学与工程学院就读.我心里不是很喜欢这个专业,但是因为当初的某种原因就入了这个门.自从学习了计算机以后,我发现这个专业可谓“博大精深, ...

  7. Effective Java 02 Consider a builder when faced with many constructor parameters

    Advantage It simulates named optional parameters which is easily used to client API. Detect the inva ...

  8. Effective Java 53 Prefer interfaces to reflection

    Disadvantage of reflection You lose all the benefits of compile-time type checking, including except ...

  9. Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址

    Java并发大师Brain Goetz和Doug Lea是Java并发方面最权威的人物,他的文章绝对是最具有参考价值的,值得仔仔细细的推敲和研究. Brain Goetz 中文地址:http://ww ...

  10. Oracle 性能优化之一二

    本人使用oracle时间不多,但是在项目中积累了一些经验教训,记录于此,以方便自己和他人解决类似的问题. 1.temp space超出限制的问题 问题场景: 在复杂的ETL query中,有时候一张f ...