模板模式:通过抽象类来定义一个逻辑模板,逻辑框架,逻辑原型,然后将无法决定的部分抽象成抽象类交由子类来实现,一般这些抽象类的调用逻辑还在抽象类中完成。这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板,房子要封闭,有门,有窗等等,但是要什么样的门,什么样的窗,这些并不在描述,这个交由子类来完善。

    1. /**
    2. * 房子模板
    3. */
    4. public abstract class HouseTemplate {
    5. protected String name;
    6. protected HouseTemplate (String name) {
    7. this.name = name;
    8. }
    9. protected abstract void buildDoor();
    10. protected abstract void buildWindow();
    11. protected abstract void buildWall();
    12. protected abstract void buildBase();
    13. /**
    14. * 公共逻辑
    15. */
    16. public final void buildHouse() {
    17. buildBase();
    18. buildWall();
    19. buildWindow();
    20. buildDoor();
    21. }
    22. }
    1. public class Clienter {
    2. public static void main(String[] args) {
    3. HouseTemplate houseOne = new HouseOne("房子1");
    4. HouseTemplate houseTwo = new HouseTwo("房子2");
    5. houseOne.buildHouse();
    6. houseTwo.buildHouse();
    7. }
    8. }
    1. /**
    2. * 房子1
    3. */
    4. public class HouseOne extends HouseTemplate {
    5. protected HouseOne(String name) {
    6. super(name);
    7. }
    8. @Override
    9. protected void buildDoor() {
    10. System.out.println(name + "采用防盗门");
    11. }
    12. @Override
    13. protected void buildWindow() {
    14. System.out.println(name + "窗户向北");
    15. }
    16. @Override
    17. protected void buildWall() {
    18. System.out.println(name + "墙使用大理石");
    19. }
    20. @Override
    21. protected void buildBase() {
    22. System.out.println(name + "地址使用钢铁");
    23. }
    24. }
    1. /**
    2. * 房子2
    3. */
    4. public class HouseTwo extends HouseTemplate {
    5. protected HouseTwo(String name) {
    6. super(name);
    7. }
    8. @Override
    9. protected void buildDoor() {
    10. System.out.println(name + "采用木门");
    11. }
    12. @Override
    13. protected void buildWindow() {
    14. System.out.println(name + "窗户向南");
    15. }
    16. @Override
    17. protected void buildWall() {
    18. System.out.println(name + "墙体玻璃");
    19. }
    20. @Override
    21. protected void buildBase() {
    22. System.out.println(name + "地基花岗岩");
    23. }
    24. }