【java学习笔记】设计模式3——Template Method(模板方法)模式

 该文章是阅读《图解设计模式》的学习笔记。书本链接https://www.ituring.com.cn/book/1811

    模板的本意是指带有镂空文字的薄塑料板,可以用笔在模板的镂空处进行临摹,即可写出和镂空处一样的工整文字。通过镂空处直接可以看到能够临摹出来的文字有哪些,但如果使用不同的笔进行临摹,临摹出来的文字颜色有可能是不一样的。编写程序时,也可以使用这种思维,在父类中定义处理流程的框架,在子类中实现具体处理。而这种模式就称为Template Method模式。下面来看该模式的结构图:

下面看一下每个类的具体代码:

CopyingBoard抽象类代码:

public abstract class CopyingBoard {
    public abstract void  pickUpAPen();
    public abstract void  copying();
    public abstract void  putDownAPen();
    public final void  operate(){//声明为final,表示在子类中无法重写该方法,因此如果要继承该抽象类则无法修改该方法
        pickUpAPen();
        copying();
        putDownAPen();
    }
}

 Pencil类代码:

public class Pencil extends CopyingBoard {
    @Override
    public void pickUpAPen() {
        System.out.println("拿起了铅笔");
    }

    @Override
    public void copying() {
        System.out.println("使用铅笔进行临摹");
    }

    @Override
    public void putDownAPen() {
        System.out.println("放下了铅笔");
    }
}

RedPen类代码:

public class RedPen extends CopyingBoard {
    String color;
    String name;

    public RedPen(String color ,String name) {
        this.color = color;
        this.name = name;
    }

    @Override
    public void pickUpAPen() {
        printLine();
        System.out.println("拿起了"+color+"色的"+name);
    }

    @Override
    public void copying() {
        System.out.println("使用"+color+"色的"+name+"进行临摹");
    }

    @Override
    public void putDownAPen() {
        System.out.println("放下了"+color+"色的"+name);
        printLine();
    }

    public void printLine(){
        System.out.println("--------分隔线---------");
    }
}

People入口类代码:

public class People {
    public static void main(String[] args) {
        CopyingBoard pencil = new Pencil();
        CopyingBoard redPen = new RedPen("红","钢笔");
        CopyingBoard bluePen = new RedPen("蓝","钢笔");
        pencil.operate();
        redPen.operate();
        bluePen.operate();
    }
}

通过观察上面的代码可以发现,使用了该模式后,在父类的模板方法operate中编写了算法之后,无需在每个子类中再编写算法。如果不使用该模式来实现,而是使用复制粘贴直接编写多个类似的类,假如最后才发现operate函数的算法逻辑有错误,那么就要全部重新改,而使用了该模式则没有这种问题。接着分析一下该模式对父类和子类之间有什么要求,

父类对子类的要求:

1.在子类中可以调用父类的方法

2.可以在子类中重写父类的方法改变程序的行为

3.可以在子类中增加父类之外的方法实现新功能

子类对父类的要求:

1.期待并要求子类去实现抽象方法

分析该模式中出现的角色:

1.AbstractClass(抽象类):即上面代码中的CopyingBoard类,该类负责实现模板方法(如上面的operate方法),并负责声明在模板方法中所使用的到的抽象方法(如上面的pickUpAPen、copying、putDownAPen方法)。

2.ConcreteClass(具体类):即上面代码中的Pencil和RedPen类,负责实现抽象类中定义的抽象方法(如上面的pickUpAPen、copying、putDownAPen方法),这些实现的方法会在抽象类的模板方法中调用。除此之类,还可以在具体类中增加父类之外的方法实现新功能。

发布了54 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_35800355/article/details/105308592