敏捷软件开发(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 ... 
随机推荐
- 基于ListBox的相关操作
			Winform中两个listbox的操作是平时比较常用的操作. 本次将以一个Winform实例来分享一下两个listbox的操作,包括:listbox添加项,项的上移下移等操作. 假设有两个listb ... 
- WinForm 多窗体操作
			1多窗体操作:确定哪个是主窗体 通过窗体进入其他窗体 代码如下 Form2 f2 = new Form2();//f2窗体实例化出来 f2.Show();//进入f2窗体 this.Hide();// ... 
- Object C中的数据类型表
			类型 例子 NSLog chars char 'a', '\n' %c short int — %hi, %hx, %ho unsigned short int %hu, %hx, %ho ... 
- C#的变迁史 - C# 1.0篇
			C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ... 
- SSH服务器与Android通信(2)--Android客户端接收数据
			基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据. 1. 新建一个Android项 ... 
- Failed to create the Java Virtual Machine.问题的解决
			运行Eclipse,出现了"Failed to create the Java Virtual Machine."错误: 解决的办法是在Eclipse的解压目录下找到eclipse ... 
- HDU 3328 Flipper 栈 模拟
			首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边的牌堆,L表示翻一下左边的牌堆,直到最后摞成 ... 
- 《高可用MySQL》2 – 单机版MySQL主从配置
			这里搭建的主从是最简单的单一主从复制(即一个Master和一个slave,没有任何的热机备份和多slave),该主从结构的基本拓扑图如下所示: 建立基本的主从复制可以总结为以下三个基本步骤: 配置ma ... 
- Android填坑系列:Android JSONObject 中对key-value为null的特殊处理
			在与服务端通过JSON格式进行交互过程中,不同版本的JSON库在对于key-value为null情况上的处理不同. Android自带的org.json对key-value都要求不能为null,对于必 ... 
- java三种实现线程的方法比较
			1.继承Thread 2.实现Runnable 1和2的比较,1可以创建不同的任务,每个任务互不干扰,对于2,相当于只执行一个任务,多个任务之间互相影响,比如售票系统,每售出一张票,票数都要减1,这个 ... 
