最近在读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. Android开发 Failed to install *.apk on device 'emulator-5554': EOF

    在运行android 程序时出现这样的错误: Failed to install homework.apk on device 'emulator-5554': EOF java.io.IOExcep ...

  2. 转:HTTP 1.1与HTTP 1.0的比较

    原文地址:http://blog.csdn.net/elifefly/article/details/3964766 HTTP 1.1与HTTP 1.0的比较 一个WEB站点每天可能要接收到上百万的用 ...

  3. Android屏蔽HOME键

    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; @Override protected void onCreate(Bund ...

  4. 【转】Android 语言切换过程分析

    最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog. ...

  5. IOS SDWebImage实现原理详解

    在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于获取网络图片的原理,如果没有第三方我们该怎么去 ...

  6. iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合

    1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...

  7. windows 注册表编程

    例子:将本地计算机的Monitor ID写入到注册表中 (1)获取MonitorID BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID ...

  8. 菜鸟教程 Python100例 之实例29

    学习编程的路,走得好艰辛... 为了巩固基础知识,把菜鸟教程网上的实例拿来练习.. 在做到实例29时,看了网站给出的代码,觉得可以加强一下功能,不由得动了一下脑筋,如下: 原文题目: 题目:给一个不多 ...

  9. 正确使用 Volatile 变量——Brian Goetz

    本文转自:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 由Java并发大师Brian Goetz所撰写的. Java 语言中的 v ...

  10. rabbitmq server的安装以及常用的命令

    Centos 源代码编译 安装 ErlangErlang依赖哪些库? A fully working GCC compiler environment         Ncurses developm ...