敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式
1.TEMPLATE METHOD
泛型,也就是这个模式,是可以基于泛型的。
我们往往会有一些算法,比如排序算法。它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面。
看如下冒泡排序算法:
package com.joyfulmath.agileexample.template.method; /**
* @author deman.lu
* @version on 2016-06-09 10:04
*/
public abstract class BubbleSorter {
private int operations = 0;
protected int length = 0;
protected int doSort()
{
operations = 0;
if(length<=1)
return operations; for(int nextToLast = length-2;nextToLast>=0;nextToLast--)
for(int index = 0;index<=nextToLast;index++)
{
if(outOfOrder(index))
{
swap(index);
}
}
return operations;
} protected abstract void swap(int index);
protected abstract boolean outOfOrder(int index); }
先看int的排序:
package com.joyfulmath.agileexample.template.method; /**
* @author deman.lu
* @version on 2016-06-09 10:18
*/
public class IntBubbleSorter extends BubbleSorter{
private int[] array = null; public int sort(int[] theArray)
{
array = theArray;
length = theArray.length;
return doSort();
} @Override
protected void swap(int index) {
int temp = array[index];
array[index] = array[index+1];
array[index+1] = temp;
} @Override
protected boolean outOfOrder(int index) {
return array[index]>array[index+1];
}
}
只要实现了比较和交换2个接口,就可以了。
在看看基于泛型的子类:
package com.joyfulmath.agileexample.template.method; /**
* @author deman.lu
* @version on 2016-06-09 10:23
*/
public class GenericBubbleSorter<T extends Comparable> extends BubbleSorter { private T[] array = null; public int sort(T[] theArray)
{
array = theArray;
length = theArray.length;
return doSort();
} @Override
protected void swap(int index) {
T temp = array[index];
array[index] = array[index+1];
array[index+1] = temp;
} @Override
protected boolean outOfOrder(int index) {
return array[index].compareTo(array[index+1])>0;
}
}
public class BubbleDemo {
public static void action()
{
Integer[] array = new Integer[]{
1,2,3,5,6,8,10,0,2,3
};
GenericBubbleSorter<Integer> intBubleSorter = new GenericBubbleSorter<>();
intBubleSorter.sort(array);
for(int i=0;i<array.length;i++)
{
TraceLog.i(array[i].toString());
}
}
}
这样就可以实现冒泡排序了。
敏捷开发的原则,就是不一定要使用设计模式,看情况,看需要。所以这里可以说这个BubbleSorter有些多余,直接GenericBubbleSorter使用,并实现排序算法就可以,视具体情况而定。
但是有时候,我们希望把排序算法和具体的使用者隔离开来,或者说我希望修改排序算法,但不修改其他的代码,这样耦合就降低了。
2.STRATEGY 模式
关于策略模式的介绍,可以看我以前的博客:设计模式4---策略模式
这里我们介绍冒泡排序的另一种模式。
public class BubbleSorter {
private int operations = 0;
protected int length = 0;
private SortHandler itsSortHandle = null;
public BubbleSorter(SortHandler itsSortHandle) {
this.itsSortHandle = itsSortHandle;
}
public int sort(Object array) {
itsSortHandle.setArray(array);
length = itsSortHandle.length();
operations = 0;
if (length <= 1)
return operations;
for (int nextToLast = length - 2; nextToLast >= 0; nextToLast--)
for (int index = 0; index <= nextToLast; index++) {
if (itsSortHandle.outOfOrder(index)) {
itsSortHandle.swap(index);
}
operations++;
}
return operations;
}
}
这里把排序算法还是放在BubbleSorter里,他不知道谁要排序(SortHandler ),所以BubbleSorter & SortHandler 的实现类是 解耦的。
public class GenericSortHandle<T extends Comparable> implements SortHandler {
private T[] array = null;
@Override
public void swap(int index) {
T temp = array[index];
array[index] = array[index+1];
array[index+1] = temp;
}
@Override
public boolean outOfOrder(int index) {
return array[index].compareTo(array[index+1])>0;
}
@Override
public int length() {
return array.length;
}
@Override
public void setArray(Object array) {
this.array = (T[]) array;
}
}
这里可以做2个替换,一个是排序算法,一个是排序的素材。这就是策略模式,
算法可以替换,算法使用的环境是一致的。
public class BubbleDemo2 {
public static void action()
{
Integer[] array = new Integer[]{
1,2,3,5,6,8,10,0,2,3
};
GenericSortHandle<Integer> intBubleSorter = new GenericSortHandle<>();
BubbleSorter bubbleSorter = new BubbleSorter(intBubleSorter);
bubbleSorter.sort(array);
for(int i=0;i<array.length;i++)
{
TraceLog.i(array[i].toString());
}
}
}
还是那句话,设计模式的使用,根据具体情况而定,如果需求,环境发生变化,就有可能从没有设计模式,到重构代码,运用设计模式。
这就是敏捷开发,根据需求变化而变换设计模式的使用,包括不使用任何模式!
参考:
《敏捷软件开发》 Robert C. Martin
敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式的更多相关文章
- 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...
- 敏捷软件开发(1)--- STATE 模式
如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- 敏捷软件开发 原则 模式 与实践 - OCP原则
最近在读BOB大叔的敏捷软件开发,特别是TDD那一章节,启示真的不少,从测试驱动开发,讲到驱动表明程序设计的意图,从设计意图讲到对象依赖的解耦,从解耦建立Mock对象. 其实是对每个模块都编写单元测试 ...
- 【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 ...
- 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述
第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...
随机推荐
- ASP.NET MVC系列:添加模型的验证规则
首先,在模型类中引用 System.ComponentModel.DataAnnotations 命名空间;System.ComponentModel.DataAnnotations 命名空间提供定义 ...
- c#中高效的excel导入sqlserver的方法
将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S ...
- iOS阶段学习第19天笔记(协议-Protocol)
iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者 之间通讯的一种方式 2) ...
- 【原创】asp.net导出word 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a
我的服务器:windows server 2008(64位)+microsoft office 2007 企业版 业务:网站导出应聘word简历. 出现以下错误: 检索 COM 类工厂中 CLSID ...
- jquery简单原则器(匹配偶数元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【Java每日一题】20161118
package Nov2016; public class Ques1118 { public static final int NUM = 10000000; public static void ...
- windows下打包react-native应用程序
P.S.0:不截图了,上传图片太麻烦,每次只能上传一张.... 先生成签名文件,如果已有签名文件略过此步: keytool -genkey -v -keystore my-release-key.ke ...
- Guava学习笔记:简化异常处理的Throwables类
有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中.Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常.例如: import java.io.IOE ...
- Git修改提交的用户名和Email
git config --global user.name "Your Name" git config --global user.email you@example.com
- org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread---------程序报错
今天遇到了这个问题: org.hibernate.NonUniqueObjectException: a different object with the same identifier value ...