【设计模式】模板模式

【设计模式】模板模式,第1张

模板模式

模板是对多个事物的结构、形式、行为的模式化总结,而模板方法(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赛车开动了!

这是模板模式案例的类图:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/720040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存