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 模式的更多相关文章

  1. 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式

    COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...

  2. 敏捷软件开发(1)--- STATE 模式

    如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...

  3. 敏捷软件开发:原则、模式与实践——第14章 使用UML

    第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...

  4. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

    第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...

  5. 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

    第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...

  6. 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则

    第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...

  7. 敏捷软件开发 原则 模式 与实践 - OCP原则

    最近在读BOB大叔的敏捷软件开发,特别是TDD那一章节,启示真的不少,从测试驱动开发,讲到驱动表明程序设计的意图,从设计意图讲到对象依赖的解耦,从解耦建立Mock对象. 其实是对每个模块都编写单元测试 ...

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

  9. 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

    第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...

随机推荐

  1. [Asp.net 5] DependencyInjection项目代码分析

    最近在研究开源代码,正好发现Asp.net5的源码,下载地址:https://github.com/aspnet. 今天主要讲的是DependencyInjection这部分,抛砖引玉,供大家参考,也 ...

  2. 再谈ABC

    最近一直在看蒋老师那13篇<我的WCF之旅>,终于看完了,看得很慢,记得最初出来工作的时候那时的技术总监建议我去看的,可几个月前我才开始看,看了几个月才把13篇看完.第一篇WCF的博文是我 ...

  3. android 开发环境搭建

    http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/2769409.html http://jingyan.baidu.com/article/7 ...

  4. WIN-CE系统架构

    WIN-CE 系统架构分为素部分:硬件层.OEM 层.操作系统层.应用层 http://hovertree.com/hvtart/bjae/oy9pqb94.htm 硬件层: 由CPU .存储器.I/ ...

  5. Saas

    SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与“on-demand softwa ...

  6. gcd和ex_gcd

    gcd就是欧几里得算法,可以快速的求出俩个数的最大公因数,进而也可以求其最大公倍数(俩数之积除以最大公因数),比较简单直接看代码就好了,一般用递归版,简短精简,敲得快,但如果数剧奇葩,怕溢出,那就用递 ...

  7. 回文字算法(java版本)

    package com.gdh.backtext;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry; p ...

  8. 【Effective Java】7、优先考虑泛型方法

    package cn.xf.cp.ch02.item27; import java.util.HashSet; import java.util.Set; public class Union { / ...

  9. 原博客地址http://blog.chinaunix.net/uid/20656672.html弃用

    原博客地址http://blog.chinaunix.net/uid/20656672.html弃用

  10. 向 Web 开发人员推荐35款 JavaScript 图形图表库

    图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web 应用和项目的可靠性. 在这篇文章中,我们收集了3 ...