敏捷软件开发 原则 模式 与实践 - OCP原则
最近在读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原则的更多相关文章
- 敏捷软件开发:原则、模式与实践——第9章 OCP:开放-封闭原则
第9章 OCP:开放-封闭原则 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 9.1 OCP概述 遵循开放-封闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(open f ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 【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 ...
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述
第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...
- 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则
第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的 ...
- 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)
Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...
随机推荐
- Python连接MySQL数据库
连接MySQL数据库 源码: import MySQLdb #导入MySQLdb模块 print '连接数据库</br>' #连接MySQL数据库 connect the database ...
- 高清SDI编码器|上海视涛科技
SDI编码器(E500)简介 SDI编码器(E500)是上海视涛科技出品的高性能SDI编码产品.该SDI编码器是上海视涛电子完全自主研发,并适用于各种SDI信号的编码采集及网络传输的专用硬件设备.可兼 ...
- Git使用ssh key
生成ssh key步骤 这里以配置github的ssh key为例: 1. 配置git用户名和邮箱 git config user.name "用户名" git config us ...
- oc语言常用的字符串函数
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- OC小实例关于init方法不小心的错误
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- HTTPS(SSL/TLS) 原理之深入浅出
注:本文参考自网络上的多篇HTTPS相关文章,本人根据自己的理解,进行一些修改,综合. 1. 必要的加密解密基础知识 1)对称加密算法:就是加密和解密使用同一个密钥的加密算法.因为加密方和解密方使用的 ...
- 关于Javascript中的复制
在做项目时有一个需求,是需要复制内容到剪切板,因为有众多浏览器,所以要兼容性很重要 1.最简单的copy,只能在IE下使用 使用clipboardData方法 <script type=&quo ...
- ArcGIS API for JavaScript Beta初步试探(一)
这段时间一直在看https://developers.arcgis.com/javascript/beta/sample-code/index.html, 下面直接看图片: 叠加了二维arcgis s ...
- Jena学习笔记(2)——利用数据库保存本体
注明:本文档是使用Jena2.6.4,数据库为MySQL,数据库驱动版本为mysql-connector-java-5.1.13-bin.jar. 1 Jena的数据库接口 Jena提供了将RDF数据 ...
- hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
view code//hdu 3987 #include <iostream> #include <cstdio> #include <algorithm> #in ...