您的位置:首页 > 编程语言

模板方法模式--介绍、应用及代码

2014-02-27 10:53 507 查看
一谈到模板方法,“菜鸟”们有自信了,因为它的存在,可以说大多数程序员都真正并应用过了设计模式,因为。。。

--------对模板方法感触最深的应该是公司技术大牛和刚入职的新员工。技术大牛搭建好主框架,具体实现交给新员工。

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构既可重定义该算法中的某些特定步骤。

实例:

情景1:用本人开发双色球预测软件做实例。当某一期的双色球结果出来以后,我很希望能够验证它是否符合我定义的规则,并找到该组号码的规律。

应用1:方法

假设1:在没有时间的情况下,我会定义好需要检验哪些规则,至于具体这些规则如何实现,我可以等到有时间的时候来完成。

代码:

输入:当期号码Set 输出:是否符合规则boolean

public boolean isRedValid(Set redSet) {
if(!isRedValidByLX2(redSet)){
return false;
}
if(!isRedValidByCmp(redSet)){
return false;
}
if(!isRedValidByFC(redSet)){
return false;
}
if(!isRedValidByApriori(redSet)){
return false;
}
return true;
}
public boolean isRedValidByLX2(Set redSet) {
boolean flag = true;
List<String> list = Test.getInvalidFC2LX();
String tmp = "";
for (String s : list) {
if (redSet.contains(Integer.parseInt(s.split(",")[0]))
&& redSet.contains(Integer.parseInt(s
.split(",")[1]))) {
tmp = s;
flag = false;
break;
}
}
if (!flag) {
System.out.println("注意:生成的数字包含不可能生成的连续2连号" + tmp
+ "需要重新生成!");
try {
String s="";
Iterator it = redSet.iterator();
for (int i = 0; i < 6; i++) {
if (it.hasNext()) {
s+=(it.next().toString());
}
}
FileOperation.FileWriteFCYes("注意:生成的数字包含不可能生成的连续2连号" + tmp
+ "需要重新生成!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
其他代码略

情景2:入职时,你的team leader想检验你的代码水平,然后又想你的工作队项目有益,他把主要逻辑一写,剩下的交给你去实现。

应用2:类

假设2:如果是在公司,如果,我是说如果我是一个大牛,我需要写一个类,它的作用是数据结构之间的转换。功能需要,实现其实简单。这个时候,我会把框架打好,然后让我的“徒弟”去实现这些方法。

代码:

我需要这样

import java.util.List;

public abstract class DataFormatConvertAbstract {

// 将“116”变成1,1,6;将"09,17,"变成9,17(整数)
public abstract int[] strToIntArr(String s);

// 将“116”变成1,1,6;将"09,17,"变成09,17(字符串)
public abstract String[] strToStrArr(String s);

// 列表转换成字符串
public abstract String[] listToStrArr(List<String> list);
}
我徒弟需要这样

public class DataFormatConvert implements DataFormatConvertAbstract {

// 将“116”变成1,1,6;将"09,17,"变成9,17(整数)
public static int[] strToIntArr(String s) {
int[] result;
if (s.indexOf(",") == -1) {
char[] tmp;
tmp = s.toCharArray();
result = new int[tmp.length];
for (int i = 0; i < tmp.length; i++) {
result[i] = Integer.parseInt(String.valueOf(tmp[i]));
}
} else {
String[] tmp = s.split(",");
result = new int[tmp.length];
for (int i = 0; i < tmp.length; i++) {
result[i] = Integer.parseInt(String.valueOf(tmp[i]));
}
}
return result;
}

// 将“116”变成1,1,6;将"09,17,"变成09,17(字符串)
public static String[] strToStrArr(String s) {
String[] resultStr = null;
if (s.indexOf(",") == -1) {
char[] tmp;
tmp = s.toCharArray();
resultStr = new String[tmp.length];
for (int i = 0; i < tmp.length; i++) {
resultStr[i] = String.valueOf(tmp[i]);
}
} else {
String[] tmp = s.split(",");
resultStr = new String[tmp.length];
for (int i = 0; i < tmp.length; i++) {
resultStr[i] = tmp[i];
}
}
return resultStr;
}

// 将“116”变成1,1,6;将"09,17,"变成09,17(字符串)
public static List<String> strToList(String s) {
List<String> result = null;
if (s.indexOf(",") == -1) {
char[] tmp;
tmp = s.toCharArray();
result = new ArrayList<String>();
for (int i = 0; i < tmp.length; i++) {
result.add(String.valueOf(tmp[i]));
}
} else {
String[] tmp = s.split(",");
result = new ArrayList<String>();
for (int i = 0; i < tmp.length; i++) {
result.add(tmp[i]);
}
}
return result;
}
}
最后,我测试

DataFormatConvertAbstract dfca=new DataFormatConvert();

int[] m = strToIntArr("119,09");
for (int i = 0; i < m.length; i++) {
System.out.println(m[i]);
}
String[] m = strToStrArr("119,09,");
for (int i = 0; i < m.length; i++) {
System.out.println(m[i]);
}


It's all!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息