模板方法:

定义一个算法的大纲,而由其子类定义其中某些步骤的内容。而其算法的个别步骤可以有不同的实现细节。算法结构依然维持不变。用继承的方式改变算法中的具体步骤,依赖程度高,算法在父类(父类是抽象类)中实现,算法的具体步骤在子类中实现。

策略模式:

定义一个算法家族,并让这些算法可以互换。用组合的方式改变整个算法,依赖程度低,父类是接口类,算法在子类中具体实现。

示例冒泡算法:

模板方法有三个类具体代码如下:

package asdppp.TmBSorter;
//父类为抽象类
public abstract class BubbleSorter
{
  private int operations = 0;

//使用protected是为了让子类可以赋值

protected int length = 0;
//封装了抽象的冒泡算法,之所以是抽象的因为在这个算法中swap(怎么交换)、outOfOrder(是否交换)被抽象出来了

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);
        operations++;
      }

return operations;
  }
//算法中的swap、outOfOrder两个步骤需要子类具体实现对哪些array进行操作
  protected abstract void swap(int index);
  protected abstract boolean outOfOrder(int index);
}

第一个子类

package asdppp.TmBSorter;

//继承父类也就继承了其算法
public class DoubleBubbleSorter extends BubbleSorter
{
  private double[] array = null;

//两个子类使用了父类的算法,两个子类的数据类型参数是swap和outOfOrder虽然代码相同但其实不同

public int sort(double [] theArray)
  {
    array = theArray;

//对父类算法的length进行赋值

length = array.length;
    return doSort();
  }

//具体实现了其算法中的具体步骤swap、outOfOrder,其实本例中子类的这两个代码是一样的

protected void swap(int index)
  {
    double temp = array[index];
    array[index] = array[index+1];
    array[index+1] = temp;
  }

protected boolean outOfOrder(int index)
  {
    return (array[index] > array[index+1]);
  }
}

第二个子类

package asdppp.TmBSorter;
//继承父类也就继承了其算法
public class IntBubbleSorter extends BubbleSorter
{
  private int[] array = null;
  public int sort(int [] theArray)
  {
    array = theArray;
    length = array.length;
    return doSort();
  }
  //具体实现了其算法中的具体步骤swap、outOfOrder
  protected void swap(int index)
  {
    int temp = array[index];
    array[index] = array[index+1];
    array[index+1] = temp;
  }

protected boolean outOfOrder(int index)
  {
    return (array[index] > array[index+1]);
  }
}

测试类

package asdppp.TmBSorter;
import junit.framework.TestCase;

public class TestBubbleSort extends TestCase
{
  public static void main(String[] args)
  {
    junit.swingui.TestRunner.main(args);
  }
  public TestBubbleSort(String name)
  {
    super(name);
  }

public void testEmptyIntArray()
  {
    int[] array = new int[0];
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals(0, operations);
  }

public void testIntArrayWithOneElement()
  {
    int[] array = {0};
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals(0, operations);
    assertEquals(0, array[0]);
    assertEquals(1, array.length);
  }

public void testIntArrayWithTwoInOrderElements()
  {
    int[] array = {0,1};
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals("operations",1, operations);
    assertEquals(0, array[0]);
    assertEquals(1, array[1]);
    assertEquals(2, array.length);
  }

public void testIntArrayWithTwoOutOfOrderElements()
  {
    int[] array = {1,0};
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals("operations",1, operations);
    assertEquals("array[0]", 0, array[0]);
    assertEquals("array[1]", 1, array[1]);
    assertEquals(2, array.length);
  }

public void testIntArrayWithThreeOutOfOrderElements()
  {
    int[] array = {3,2,1};
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals("operations", 3, operations);
    assertEquals("array[0]", 1, array[0]);
    assertEquals("array[1]", 2, array[1]);
    assertEquals("array[2]", 3, array[2]);
    assertEquals(3, array.length);
  }

public void testIntArrayWithTenOutOfOrderElements()
  {
    int[] array = {9,8,7,6,5,4,3,2,1,0};
    int operations = (new IntBubbleSorter()).sort(array);
    assertEquals("operations", 45, operations);
    for (int i=0; i<10; i++)
      assertEquals("array["+i+"]", i, array[i]);
  }

public void testDoubleArrayWithTenOutOfOrderElements()
  {
    double[] array = {9,8,7,6,5,4,3,2,1,0};
    int operations = (new DoubleBubbleSorter()).sort(array);
    assertEquals("operations", 45, operations);
    for (int i=0; i<10; i++)
      assertEquals("array["+i+"]", i, array[i], .001);
  }

}

由代码可以看出算法被父类抽象出来了,具体的比如数组的长度、具体数组类型、如何交换、判断是否交换等都在子类里实现。

转载于:https://www.cnblogs.com/yelinpalace/archive/2011/07/23/2115092.html

设计模式之模板方法和策略模式的区别(一)相关推荐

  1. 设计模式初学者系列-策略模式 -------为什么总是继承

    设计模式初学者系列-策略模式                                                 -------为什么总是继承 模板方法的延续 这篇稿子是基于我的前一篇模板 ...

  2. 老王讲设计模式(一)——策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 老王最近接到一个工作,上 ...

  3. 设计模式(三)策略模式——在Spring中使用策略模式

    前言 在 设计模式(一)策略模式 -- 策略模式结构 和 设计模式(二)策略模式 -- 在程序中通过枚举使用策略模式 两篇博文中分析了策略模式的基础使用,在实际的项目开发中要结合spring容器使用策 ...

  4. 设计模式 by Python1:策略模式

    设计模式 by Python1:策略模式 最近开始重新看<Head First 设计模式>,作为一个不错的练习,打算在整理设计模式笔记的时候用Python实现. 作为第一个介绍的设计模式, ...

  5. C++设计模式学习笔记:策略模式

    C++设计模式学习笔记:策略模式 策略模式设计商场促销 1.策略模式介绍 2.商场收银系统策略模式实现 3.策略模式与工厂模式结合 3.策略模式与工厂模式对比 策略模式设计商场促销 1.策略模式介绍 ...

  6. 设计模式解读之一: 策略模式——鸭子游戏

    设计模式解读之一: 策略模式--鸭子游戏 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我 ...

  7. 模板方法模式与策略模式的区别

    2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

  8. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  9. 设计模式之桥梁模式和策略模式的区别

    桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Im ...

最新文章

  1. 深度神经网络对脑电信号运动想象动作的在线解码
  2. 【图算法】Dijkstra算法及变形
  3. ASP.NET生命周期详解(转)
  4. 【新星计划】Matlab实现数据导出
  5. linux cpu load 值,理解Linux系统中的load average(图文版)转
  6. python pdb调试快捷键,Python调试工具pdb使用详解
  7. 【Swing/文本组件】定义自动换行的文本域
  8. php负载均衡如何获得真实ip,nginx负载均衡后端RS中获取真实ip
  9. python爬虫预测_从爬虫到机器学习预测,我是如何一步一步做到的?
  10. 纽微特成立起因:申某账务有鬼,张某不干活怎么不说
  11. wps 模拟分析 规划求解_综合能源系统:规划及运行优化智慧决策平台介绍
  12. Python自动化键盘事件详解
  13. Web 开发权威指南
  14. faker 无敌了,专注于制作假数据
  15. hihocoder 1538
  16. 记录win7安装Docker for Windows(DockerToolbox)的一记大坑:wating for an ip....卡死
  17. 数据库之操作MySQL
  18. 旷世开源yolox的目标检测使用
  19. 【数据结构】名词速查
  20. CCF-CSP-202112-3:登机牌条码(C++11题解)

热门文章

  1. centos7 安装mysql_Centos7安装最新版本的MySQL
  2. arm体系结构与编程_RISCV中文版面市! MIPS、ARM、RISCV三驾马车配齐,奔向体系结构教学的新黄金时代!...
  3. Linux笔记-grep -v功能相关说明
  4. Wireshark文档阅读笔记-WebSocket协议基本概念
  5. Android逆向笔记-破解某APP签名摘要算法
  6. Ngnix笔记proxy_set_header设置X-Real-IP(Java获取客户端IP地址)
  7. Spring Boot笔记-echarts的使用及数据的修改
  8. oracle堆表和MySQL_聚簇索引对比|Oracle vs MySQL
  9. ffmpeg 丢帧 灰屏_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...
  10. python英文词频统计代码_python实现中文和英文的词频统计功能方法汇总