模板方法模式

2018-01-18  本文已影响0人  潜心之力

一、模式简介

定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
场景:算法的整体步骤很固定,但其中个别部分易变时,可以将容易变的部分抽象出来,供子类实现。当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

二、模式实现

public abstract class AbstractBusinessBank { -> 抽象类
    public final void action() { -> 模板方法,防止算法的轮廓和骨架被更改
        number();
        queue();
        if (vip()) {
            wait("客户是VIP,尊享VIP等候室");
        }else{
            wait("客户不是VIP,业务大厅等候");
        }
        business();
        score();
    }

    protected void number() { -> 具体方法
        System.out.println("相同步骤:办理业务前取号");
    }

    protected void queue() { -> 具体方法
        System.out.println("相同步骤:办理业务前排队");
    }

    protected abstract void business(); -> 抽象方法

    protected void score() { -> 具体方法
        System.out.println("相同步骤:对服务人员评分");
    }

    protected abstract boolean vip(); -> 钩子方法

    protected void wait(String content){ -> 具体方法
        System.out.println(content);
    }
}

public class ConcreteSaveBusinessBank extends AbstractBusinessBank { -> 具体实现类
    @Override
    protected void business() {
        System.out.println("不同步骤:办理业务存钱");
    }

    @Override
    protected boolean vip() {
        return true;
    }
}

public class ConcreteWithdrawBusinessBank extends AbstractBusinessBank{ -> 具体实现类
    @Override
    protected void business() {
        System.out.println("不同步骤:办理业务取钱");
    }

    @Override
    protected boolean vip() {
        return false;
    }
}

以客户到银行办理业务为例子,必经四大步骤:办理前取号、办理前排队、办理相关业务、办理后评分,其中取号、排队、评分都是固定的步骤,可以在抽象业务中实现,相关业务则因客户而异,可以是存钱、取钱、办卡等等,可以延迟到具体业务中实现。

AbstractBusinessBank save = new ConcreteSaveBusinessBank();
save.action();

AbstractBusinessBank withdraw = new ConcreteWithdrawBusinessBank();
withdraw.action();
上一篇 下一篇

猜你喜欢

热点阅读