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

最新文章

  1. 触发器事件trigger
  2. Linux IPC POSIX 信号量
  3. Android -- TextView (3)
  4. UVa 1339,紫书P73,词频
  5. vb 和vb.net的区别
  6. noi 97 积木游戏
  7. DB2创建序列
  8. ln (link)命令
  9. Java字符串的最大长度
  10. Windows 设置时间同步
  11. (?m) 标记
  12. 如何获取浏览器的DNS解析时间
  13. B - ACboy needs your help(动态规划,分组背包)
  14. 使用jquery.PrintArea.js打印网页的样式问题
  15. Java_流程控制
  16. struts.xml,报错 1 c.opensymphony.xwork2.util.DomHelper
  17. 数据分析---SQL(删除数据或表)
  18. Behavior开发时找不到Expression.Interactions的问题解决
  19. 二十一、当锚点遇到fixed(margin和padding)
  20. OGG初始化之将数据从文件加载到Replicat

热门文章

  1. Nancy 学习-视图引擎 继续跨平台
  2. CSS使图片变灰
  3. 在吉日嘎拉DotNet.WebForm中使用FluentScheduler调度任务
  4. Eclipse使用多个Console
  5. 【FOL】万里长征第一步
  6. 使用Spring的@Scheduled实现定时任务
  7. Thinkphp各种方法知识图谱
  8. 【背景建模】PbModel
  9. Code First :使用Entity. Framework编程(4) ----转发 收藏
  10. Dynatable – 基于 HTML5 &amp; jQuery 的交互表格插件