模板是对多个事物的结构、形式、行为的模式化总结,而模板方法(Template Method)则是对一系列类行为(方法)的模式化。我们将总结出来的行为规律固化在基类中,对具体的行为实现则进行抽象化并交给子类去完成,如此便实现了子类对基类模板的套用,下面拿汽车制造举例:
我们通常见到的汽车都有车身、轮子、引擎等部件,所以每一个汽车都需要这些部件才可以正常行驶,我们可以根据汽车的特征对制造汽车进行一下抽象,抽象出一个汽车制造类作为基类模板:
public abstract class Car {
public abstract String carType();
public abstract String createBody();
public abstract String createWheels();
public abstract String createEngine();
public abstract String createChassis();
public abstract String painting();
public final void run(String Body, String Wheels, String Engine, String Chassis, String Paint, String CarType) {
System.out.println("安装了" + Body + "车身、" + Wheels + "轮胎、" + Engine + "引擎、" + Chassis + "底盘、" + Paint + "漆面的" + CarType + "开动了!");
}
}
汽车制造需要制作车身、车轮、引擎、底盘,然后还要喷漆,然后汽车还有类型,如越野车、小轿车等。我们有了这个汽车制造模板就可以拿来生产汽车了,先试着生产一辆拉力赛车RallyCar,并将模板类的方法进行重写:
public class RallyCar extends Car {
@Override
public String carType() {
String carType = "拉力赛车";
return carType;
}
@Override
public String createBody() {
String body = "防滚架";
return body;
}
@Override
public String createWheels() {
String wheels = "米其林";
return wheels;
}
@Override
public String createEngine() {
String engine = "V6";
return engine;
}
@Override
public String createChassis() {
String chassis = "多连杆后整体桥式";
return chassis;
}
@Override
public String painting() {
String painting = "红色";
return painting;
}
}
再尝试生产一辆F1赛车F1Car:
public class F1Car extends Car {
@Override
public String carType() {
String carType = "F1赛车";
return carType;
}
@Override
public String createBody() {
String body = "轻量化";
return body;
}
@Override
public String createWheels() {
String wheels = "热熔";
return wheels;
}
@Override
public String createEngine() {
String engine = "V8";
return engine;
}
@Override
public String createChassis() {
String chassis = "碳纤维单体";
return chassis;
}
@Override
public String painting() {
String painting = "银色";
return painting;
}
}
接着客户直接到对应的行驶方法开动汽车就可以了:
public class Client {
public static void main(String[] args) {
Car Rally = new RallyCar();
Rally.run(Rally.createBody(), Rally.createWheels(), Rally.createEngine(), Rally.createChassis(), Rally.createBody(), Rally.carType());
Car F1 = new F1Car();
F1.run(F1.createBody(), F1.createWheels(), F1.createEngine(), F1.createChassis(), F1.createBody(), F1.carType());
}
}
虽然F1赛车与拉力赛车一点都不一样,一个是在宽阔而平整赛车场行驶,一个是在狭窄而颠簸的土路上行驶,但是他们都有一个共同的模板:汽车制造模板,所以套用这个模板就可以生产出一辆汽车。
执行结果:
安装了防滚架车身、米其林轮胎、V6引擎、多连杆后整体桥式底盘、防滚架漆面的拉力赛车开动了!
安装了轻量化车身、热熔轮胎、V8引擎、碳纤维单体底盘、轻量化漆面的F1赛车开动了!
这是模板模式案例的类图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)