最近在读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. [js开源组件开发]图片懒加载lazyload

    图片懒加载lazyload 前端对请求的一种优化方式,为什么叫懒加载,无从查起,反正我当初一直认为它是滚动加载的一种类型.它主要是以图片或背景在可视区域内时才显示真正的图片,减少src带来的负荷.所以 ...

  2. [JS,NodeJs]个人网站效果代码集合

    上次发的个人网站效果代码集合: 代码集合: 1.彩色文字墙[鼠标涟漪痕迹] 2.彩色旋转圆环 [模仿http://www.moma.org/interactives/exhibitions/2012/ ...

  3. 详解HTML5中rel属性的prefetch预加载功能使用

    在HTML5中,有个很有用但常被忽略的特性,就是预先加载(prefetch),它的原理是: 利用浏览器的空闲时间去先下载用户指定需要的内容,然后缓存起来,这样用户下次加载时,就直接从缓存中取出来,效率 ...

  4. ArcGis在Oracle中常用的sql

    ) m 查询坐标数据 更新坐标: update tableName set SHAPE = mdsys.sdo_geometry(2002,28420,null,mdsys.sdo_elem_info ...

  5. 我在用的mac软件(1)--终端环境之iTerm2

    之前一直有朋友要我分享下在用的mac软件,今天有空就来写一下,可能不止于软件,会有一些配置或者工具,或者叫环境更合适.有些可能一句话带过,有些会详细介绍.也不分类了,想到哪个就写出来.如果已经写的足够 ...

  6. UVa 109 - SCUD Busters(凸包计算)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  7. (转)为什么大公司青睐Java

    转自 http://www.zhihu.com/question/25908953/answer/32119971 因为这是一个商业问题,不是技术问题. 我在面试时探讨过这个问题,对方创业期,问我如果 ...

  8. 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 ...

  9. Nde模块篇

    /*模块分为两种:原生模块和文件模块.原生模块即Node.js API提供的原生模块,原生模块在启动时已经被加载.文件模块即为动态加载模块,加载文件模块的工作主要由原生模块 module 来实现和完成 ...

  10. Spring AOP 深入剖析

    AOP是Spring提供的关键特性之一.AOP即面向切面编程,是OOP编程的有效补充.使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统.从而避免了在业务逻 ...