设计模式之模板方法和策略模式的区别(一)
模板方法:
定义一个算法的大纲,而由其子类定义其中某些步骤的内容。而其算法的个别步骤可以有不同的实现细节。算法结构依然维持不变。用继承的方式改变算法中的具体步骤,依赖程度高,算法在父类(父类是抽象类)中实现,算法的具体步骤在子类中实现。
策略模式:
定义一个算法家族,并让这些算法可以互换。用组合的方式改变整个算法,依赖程度低,父类是接口类,算法在子类中具体实现。
示例冒泡算法:
模板方法有三个类具体代码如下:
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
设计模式之模板方法和策略模式的区别(一)相关推荐
- 设计模式初学者系列-策略模式 -------为什么总是继承
设计模式初学者系列-策略模式 -------为什么总是继承 模板方法的延续 这篇稿子是基于我的前一篇模板 ...
- 老王讲设计模式(一)——策略模式
策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 老王最近接到一个工作,上 ...
- 设计模式(三)策略模式——在Spring中使用策略模式
前言 在 设计模式(一)策略模式 -- 策略模式结构 和 设计模式(二)策略模式 -- 在程序中通过枚举使用策略模式 两篇博文中分析了策略模式的基础使用,在实际的项目开发中要结合spring容器使用策 ...
- 设计模式 by Python1:策略模式
设计模式 by Python1:策略模式 最近开始重新看<Head First 设计模式>,作为一个不错的练习,打算在整理设计模式笔记的时候用Python实现. 作为第一个介绍的设计模式, ...
- C++设计模式学习笔记:策略模式
C++设计模式学习笔记:策略模式 策略模式设计商场促销 1.策略模式介绍 2.商场收银系统策略模式实现 3.策略模式与工厂模式结合 3.策略模式与工厂模式对比 策略模式设计商场促销 1.策略模式介绍 ...
- 设计模式解读之一: 策略模式——鸭子游戏
设计模式解读之一: 策略模式--鸭子游戏 当我们掌握了Java的语法,当我们了解了面向对象的封装.继承.多态等特性,当我们可以用Swing.Servlet.JSP技术构建桌面以及Web应用,不意味着我 ...
- 模板方法模式与策略模式的区别
2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...
- 23种设计模式之命令模式和策略模式的区别
文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...
- 设计模式之桥梁模式和策略模式的区别
桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Im ...
最新文章
- 深度神经网络对脑电信号运动想象动作的在线解码
- 【图算法】Dijkstra算法及变形
- ASP.NET生命周期详解(转)
- 【新星计划】Matlab实现数据导出
- linux cpu load 值,理解Linux系统中的load average(图文版)转
- python pdb调试快捷键,Python调试工具pdb使用详解
- 【Swing/文本组件】定义自动换行的文本域
- php负载均衡如何获得真实ip,nginx负载均衡后端RS中获取真实ip
- python爬虫预测_从爬虫到机器学习预测,我是如何一步一步做到的?
- 纽微特成立起因:申某账务有鬼,张某不干活怎么不说
- wps 模拟分析 规划求解_综合能源系统:规划及运行优化智慧决策平台介绍
- Python自动化键盘事件详解
- Web 开发权威指南
- faker 无敌了,专注于制作假数据
- hihocoder 1538
- 记录win7安装Docker for Windows(DockerToolbox)的一记大坑:wating for an ip....卡死
- 数据库之操作MySQL
- 旷世开源yolox的目标检测使用
- 【数据结构】名词速查
- CCF-CSP-202112-3:登机牌条码(C++11题解)
热门文章
- centos7 安装mysql_Centos7安装最新版本的MySQL
- arm体系结构与编程_RISCV中文版面市! MIPS、ARM、RISCV三驾马车配齐,奔向体系结构教学的新黄金时代!...
- Linux笔记-grep -v功能相关说明
- Wireshark文档阅读笔记-WebSocket协议基本概念
- Android逆向笔记-破解某APP签名摘要算法
- Ngnix笔记proxy_set_header设置X-Real-IP(Java获取客户端IP地址)
- Spring Boot笔记-echarts的使用及数据的修改
- oracle堆表和MySQL_聚簇索引对比|Oracle vs MySQL
- ffmpeg 丢帧 灰屏_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...
- python英文词频统计代码_python实现中文和英文的词频统计功能方法汇总