大话设计模式

第10章 模板方法模式

2020-03-22  本文已影响0人  小超_8b2f

学生B抄袭学生A的试卷

/**
 * 学生A做的试卷
 * @author 王轶
 */
public class TestPaperA {
    public void test1() {
        System.out.println("题1的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:A");
    }
    public void test2() {
        System.out.println("题2的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:B");
    }
    public void test3() {
        System.out.println("题3的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:C");
    }

}


/**
 * 学生B做的试卷
 * @author 王轶
 */
class TestPaperB {
    public void test1() {
        System.out.println("题1的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:C");
    }
    public void test2() {
        System.out.println("题2的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:B");
    }
    public void test3() {
        System.out.println("题3的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:A");
    }
}

class Test {
    public static void main(String[] args) {
        TestPaperA a = new TestPaperA();
        a.test1();
        a.test2();
        a.test3();
        
        TestPaperB b = new TestPaperB();
        b.test1();
        b.test2();
        b.test3();
    }
}

改进版,还是很多重复代码


public abstract class TestPaper {
    public void test1() {
        System.out.println("题1的:A:xxx, B:yyy,C:kkk,D:jjjj");
    }
    public void test2() {
        System.out.println("题2的:A:xxx, B:yyy,C:kkk,D:jjjj");
    }
    public void test3() {
        System.out.println("题3的:A:xxx, B:yyy,C:kkk,D:jjjj");
    }
}


class StudentA extends TestPaper{
    @Override
    public void test1() {
        super.test1();
        System.out.println("答案:A");
    }
    @Override
    public void test2() {
        super.test1();
        System.out.println("答案:B");
    }
    @Override
    public void test3() {
        super.test3();
        System.out.println("答案:C");
    }
}

class StudentB extends TestPaper{
    @Override
    public void test1() {
        super.test1();
        System.out.println("答案:C");
    }
    @Override
    public void test2() {
        super.test1();
        System.out.println("答案:B");
    }
    @Override
    public void test3() {
        super.test3();
        System.out.println("答案:B");
    }
}

最终改进版:模板方法模式实现

public abstract class TestPaper {
    public void test1() {
        System.out.println("题1的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:" + answer1());
    }
    public void test2() {
        System.out.println("题2的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:" + answer2());
    }
    public void test3() {
        System.out.println("题3的:A:xxx, B:yyy,C:kkk,D:jjjj");
        System.out.println("答案:" + answer3());
    }
    
    protected abstract  String answer1();
    protected abstract  String answer2();
    protected abstract  String answer3();
}

class StudentA extends TestPaper{
    @Override
    protected String answer1() {
        return "A";
    }
    @Override
    protected String answer2() {
        return "B";
    }
    @Override
    protected String answer3() {
        return "C";
    }
}

class StudentB extends TestPaper{
    @Override
    protected String answer1() {
        return "C";
    }
    @Override
    protected String answer2() {
        return "B";
    }
    @Override
    protected String answer3() {
        return "A";
    }
}

public class Client {
    public static void main(String[] args) {
        System.out.println("学生A的试卷:");
        TestPaper a = new StudentA();
        a.answer1();
        a.answer2();
        a.answer3();
        System.out.println("学生B的试卷:");
        TestPaper b = new StudentA();
        b.answer1();
        b.answer2();
        b.answer3();
    }
}

模板方法模式

定义一个操作中的算法股价,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义改算法的某些特定步骤。

模板方法样板
abstract class AbstractClass {
    public void templateMethod() {
        this.doBefore();
        System.out.println("hello world");
        this.doAfter();
    }

    protected abstract  String doBefore();
    protected abstract  String doAfter();
}

class ConcereteClassA extends AbstractClass {
    @Override
    protected String doBefore() {
        return "具体实现A类的前操作";
    }
    @Override
    protected String doAfter() {
        return "具体实现A类的后操作";
    }
}

class ConcereteClassB extends AbstractClass {
    @Override
    protected String doBefore() {
        return "具体实现B类的前操作";
    }
    @Override
    protected String doAfter() {
        return "具体实现B类的后操作";
    }
}

class Client {
    public static void main(String[] args) {
        AbstractClass c;

        c = new ConcereteClassA();
        c.templateMethod();

        c = new ConcereteClassB();
        c.templateMethod();
    }
}
模板方法模式特点

  模板方法模式是通过把不变行为转移到超类,去除子类中的重复代码来体现它的优势。
模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到一 系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。这时候,我们通常就应该要考虑用模板方法模式了。

  当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

上一篇下一篇

猜你喜欢

热点阅读