设计模式之模版方法模式

本篇文章介绍行为型模式中的模版方法模式,这个设计模式相对来说好理解一些,因为你可能在平时的开发中不自觉的使用到了它。在平常的开发中也许会遇到抽象类控制算法步骤,但某些方法需要延迟到子类中实现,这时候就需要模版方法模式。

模版方法模式

在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类在可以不改变算法结构的情况下,重新定义算法中的某些步骤。

假设我们有个Person抽象类,包含出生、上学、工作、娶妻和生子五个方法,对每个人来说出生和生子是一样的,但上学,工作和娶妻各有各的不同(有点强行,这意思明白就好......)。在这个场景中,必须由Person来控制算法的顺序(总得娶妻才能生子吧),但有些必须由子类实现,因此我们用模版方法设计模式来实现。

类图

模版方法模式

具体实现

Person抽象类:

abstract class Person{

    //控制算法顺序
    public final void live(){
        this.beBorn();
        this.goToSchool();
        this.work();
        this.takeAWife();
        this.born();
    }

    //出生
    protected void beBorn(){
        System.out.println("我出生啦...");
    }

    //上学
    abstract void goToSchool();

    //工作
    abstract void work();

    //娶妻
    abstract void takeAWife();

    //生子
    protected void born(){
        System.out.println("我生孩子啦...");
    }
}

具体实现类:

class Blogger extends Person{

    @Override
    void goToSchool() {
        System.out.println("我上的隔壁村的小学...");
    }

    @Override
    void work() {
        System.out.println("我享受的是996福报...");
    }

    @Override
    void takeAWife() {
        System.out.println("我还没娶媳妇呢,如果生孩子了就勉强算未婚先孕吧...");
    }
}

class SiCong extends Person{

    @Override
    void goToSchool() {
        System.out.println("我上的新加坡Swiss Cottage的小学...");
    }

    @Override
    void work() {
        System.out.println("我拿5个亿随便投投资...");
    }

    @Override
    void takeAWife() {
        System.out.println("我还没娶但我的女朋友们不是网红就是明星...");
    }
}

测试程序及输出结果:

测试程序:
public static void main(String[] args) {
    Blogger blogger = new Blogger();
    blogger.live();
    System.out.println();
    SiCong siCong = new SiCong();
    siCong.live();
}

输出结果:
我出生啦...
我上的隔壁村的小学...
我享受的是996福报...
我还没娶媳妇呢,如果生孩子了就勉强算未婚先孕吧...
我生孩子啦...

我出生啦...
我上的新加坡Swiss Cottage的小学...
我拿5个亿随便投投资...
我还没娶但我的女朋友们不是网红就是明星...
我生孩子啦...

在抽象类中控制算法顺序的方法是final的,目的是防止子类重写这个方法,不然也就失去了这个方法的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值