java设计模式学习笔记之模块方法模式

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值