java设计模式学习笔记之模块方法模式
尊重原创,转载请注明出处: http://blog.csdn.net/qq137722697
这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6》
场景还原
英语听力选择题万能答题技巧?蒙
同样的,先给出需求(运行结果):
看到这个效果,第一感觉如何实现?最简单的莫过于直接输出,但是是在学设计模式肯定没那么简单。
今天的主题是模块方法模式,
那什么是模块方法模式呢?
模块方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。【大白话就是不变的放父类,变的放子类】
从字面意思就可以知道,就是将一些不变,但是重用率高的抽取为模板,但是模板里面有可能有随时变的东西,那么就讲变的这个东西抽象出来,由具体的子类去完成。
来看看如何模块化
先将试卷模块化,因为试卷的内容是不变的
/**
* 英语四级试卷的模板
* Created by HDL on 2016/12/5.
*/
public abstract class Cet4Template {
/**
* 问题A
*/
public void questionA() {
System.out.println("问题1:\n从男人和女人的对话中,你听出男人的爱好是什么?(" + answerA() + ")\nA、运动\nB、游戏\nC、电影\nD、睡觉");
}
/**
* 回答A
*
* @return
*/
public abstract String answerA();
/**
* 问题B
*/
public void questionB() {
System.out.println("问题2:\n从男人和女人的对话中,你听出他们准备去做什么?(" + answerB() + ")\nA、打篮球\nB、旅游\nC、看电影\nD、烧烤");
}
/**
* 回答B
*
* @return
*/
public abstract String answerB();
}
考过四级的童鞋都知道是要有一张答题卡的,它会试卷一一对应
/**
* 答题卡类---与问题一一对应(还要能知道是谁的答题卡)
* Created by HDL on 2016/12/5.
*/
public class AnswerSheet extends Cet4Template {
private Student Student;//谁的答题卡
private String answerA;//回答的a问题
private String answerB;//回答的b问题
public AnswerSheet(Student Student) {
this.Student = Student;
}
public String getAnswerA() {
return answerA;
}
public void setAnswerA(String answerA) {
this.answerA = answerA;
}
public String getAnswerB() {
return answerB;
}
public void setAnswerB(String answerB) {
this.answerB = answerB;
}
@Override
public String answerA() {
return answerA;
}
@Override
public String answerB() {
return answerB;
}
public void showAnswer() {//显示答题情况
System.out.println(Student.getName() + "的答题情况:");
questionA();
questionB();
}
}
学生类
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
是时候开始考试了
public static void main(String[] args) {
Student peter = new Student("皮特");
AnswerSheet answerSheetForPeter = new AnswerSheet(peter);//皮特的答题卡
answerSheetForPeter.setAnswerA("A");
answerSheetForPeter.setAnswerB("C");
answerSheetForPeter.showAnswer();
System.out.println("------------------------分割线------------------------");
Student sami = new Student("萨米");
AnswerSheet answerSheetForSami = new AnswerSheet(sami);//萨米的答题卡
answerSheetForSami.setAnswerA("A");
answerSheetForSami.setAnswerB("D");
answerSheetForSami.showAnswer();
}
优点
其实我们在开发中随时都在用模块方法模式,也就是说它算是最常用的设计模式了
模块方法模式是通过把不变行为搬移到父类,去除子类中的重复代码来体现它的优势,它提供了一个很好的代码复用平台,当不变的和可变的行为在子类的方法中混合使用的时候,不变的行为就会在子类中从古出现,我们通过模块方法模式把这些行为搬迁到单一的地方,这样就帮子类摆脱重复的不变形为的纠缠。
尊重原创,转载请注明出处: http://blog.csdn.net/qq137722697