• 首页

  • 文章归档

  • 隔壁朋友

  • 关于博主
H B L A O
H B L A O

hblao

获取中...

03
11
java

java设计模式-模板模式

发表于 2021-03-11 • Java设计模式 模板模式 • 被 29 人看爆

模板模式(Template Pattern)

模版模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现;

简单来说就是一间没有装修的新房子,它的卧室,浴室,厨房,客厅的框架都已经建设完毕了,就等着你去打扮它,这种定好的框架就是我们说的模板,具体的东西就是要看你怎么去打扮这些房间了;

模板模式优缺点
优点:

使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求,封装不变部分,扩展可变部分;例如你装饰房子的方法有很多种,每一种都可能给你带来不一样的体验;
提取公共代码,有利于后期的维护;例如每个房间功能明确;
行为由父类控制,子类实现;比如定义了厨房这个房间,具体厨房要怎么装修,要看你的做法;
缺点:

如果算法骨架有修改的话,则需要修改抽象类;(修改整体框架是很困难的)
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。(这里类似于房间的装修方案)
设计思想
设计模板类,也就是父类,由父类规定好框架,抽象方法以及父类的功能;
具体实现留给继承父类的子类进行实现;这样就实现了父类的重复使用,也就是模板;
代码实现
首先定义一个模板类,它的非抽象方法需要定为final,因为它不希望被子类继承和改写,这个功能是父类特有的;

abstract class House {
// 子类要实现的方法;
public abstract void bathroom();
public abstract void bedroom();
public abstract void kitchen();

// 为了避免子类继承, 一般模板的方法都加上final;
public final void decorate() {
    // 装修浴室;
    bathroom();

    // 装修卧室;
    bedroom();

    // 装修厨房;
    kitchen();
}

}
接下来是实现子类,这里我们实现两个装修方案:

class scheme1 extends House {

@Override
public void bathroom() {
    System.out.println("bathroom scheme one!!!");
}

@Override
public void bedroom() {
    System.out.println("bedroom scheme one!!!");
}

@Override
public void kitchen() {
    System.out.println("kitchen scheme one!!!");
}

}

class scheme1 extends House {

@Override
public void bathroom() {
    System.out.println("bathroom scheme one!!!");
}

@Override
public void bedroom() {
    System.out.println("bedroom scheme one!!!");
}

@Override
public void kitchen() {
    System.out.println("kitchen scheme one!!!");
}

}
上面是两个装修方案,接下来来看看测试:

public class demo_house {

public static void main(String [] args) {
    House house; // 父类引用;
    // 方案1;
    house = new scheme1();
    house.decorate();
    System.out.println("---------------------");
    // 方案2;
    house = new scheme2();
    house.decorate();
}

}

下面是结果:

bathroom scheme one!!!
bedroom scheme one!!!
kitchen scheme one!!!

bathroom scheme two!!!
bedroom scheme two!!!
kitchen scheme two!!!

代码理解
House类有一个方法为装修decorate,在这个方法中有三个实现方法,但是这三个方法没有写出来,因为写出来就相当于写死了,不能再改动;于是定义成抽象方法,让其子类实现,这样的好处是让父类定义行为接口,让子类实现接口;功能模块很明确;

现在如果要多一种设计方案,只需要多增加一个方案类,让其继承House,然后让子类实现内容就好.

但是这样如果框架整体有改动的话,是一件很麻烦的是,例如我增加一个装修客厅的方法,不仅仅父类要修改,其继承的子类同时也要加入这个方法,倘若子类众多时,这也是一件很要命的事!

分享到:
Java设计模式-单例模式
Spring AOP
  • 文章目录
  • 站点概览
hblao

Hihblao

QQ Email RSS
看爆 Top5
  • 设计一个高并发的高可用系统 434次看爆
  • MySQL 常用优化指南 224次看爆
  • Spring AOP 207次看爆
  • 人到中年 188次看爆
  • RedisTemplate常用使用说明 170次看爆

Copyright © 2022 hblao · 京ICP备16001163号

Proudly published with Halo · Theme by fyang · 站点地图 · 百度统计