模板模式(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,然后让子类实现内容就好.
但是这样如果框架整体有改动的话,是一件很麻烦的是,例如我增加一个装修客厅的方法,不仅仅父类要修改,其继承的子类同时也要加入这个方法,倘若子类众多时,这也是一件很要命的事!