设计模式-行为型模式-模板方法模式

1.模板方法模式定义

        模板方法模式在父类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤;是一种基于继承的代码服用技术,其结构只存在于父类与子类之间的继承关系下;

1.1 模板方法模式的作用

  • 复用性:所有的子类都可以复用父类中提供的模板方法代码;
  • 扩展性:框架通过模板方法模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能;

1.2 模板方法模式的优缺点

优点

  • 在父类中形式化的定义一个算法,由他的子类来实现细节,子类实现细节并不会改变父类算法中的执行顺序;
  • 模板方法可以实现一种反向的控制结构,通过子类覆盖父类的钩子方法,来决定某一个特定步骤是否需要执行;
  • 在模板方法模式中,可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则;

缺点

  •  对每个不同的实现都需要定义一个子类,这会导致系统更加庞大,设计也更加抽象;
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种返乡的控制结构,提高了代码阅读的难度;

1.3 模板方法模式的使用场景

  • 多个类有相同的方法并且逻辑可以共用时;
  • 将通用的算法或固定流程设计为模板,在每个具体的子类中再继续优化算法步骤或流程时;
  • 重构长代码时,发现某一个经常使用的公共方法;

2.模板方法模式的原理

  • 抽象父类:定义一个算法所包含的所有步骤,并提供一些通用的方法逻辑;
  • 具体子类:继承自抽象父类,根据需要重写父类提供的算法步骤中的某些步骤;

3.模板方法模式实现

【实例】

P2P公司的借款系统中有一个利息计算模块,利息的计算流程是这样的:

  1. 用户登录系统,登录时需要输入账号密码,如果登录失败(比如用户密码错误),系统需要给出提示

  2. 如果用户登录成功,则根据用户的借款的类型不同,使用不同的利息计算方式进行计算

  3. 系统需要显示利息.

【代码】

        抽象父类

/**
 * 账户抽象类
 **/
public abstract class Account {
    //step1 具体方法-验证用户信息是否正确
    public boolean validate(String account,String password){
        System.out.println("账号: " + account + ",密码: " + password);
        if(account.equalsIgnoreCase("tom") &&
        password.equalsIgnoreCase("123456")){
            return true;
        }else{
            return false;
        }
    }
    //step2 抽象方法-计算利息
    public abstract void calculate();
    //step3 具体方法-显示利息
    public void display(){
        System.out.println("显示利息!");
    }
    //模板方法
    public void handle(String account,String password){
        if(!validate(account,password)){
            System.out.println("账户或密码错误!!");
            return;
        }
        calculate();
        display();
    }
}

        具体子类

/**
 * 借款一个月
 **/
public class LoanOneMonth extends Account{

    @Override
    public void calculate() {
        System.out.println("借款周期30天,利率为10%!");
    }
}

/**
 * 借款七天
 **/
public class LoanSevenDays extends Account{

    @Override
    public void calculate() {
        System.out.println("借款周期7天,无利息!仅收取贷款金额1%的服务费!");
    }

    @Override
    public void display() {
        System.out.println("七日内借款无利息!");
    }

}

        客户端

public class Client {

    public static void main(String[] args) {

        Account a1 = new LoanSevenDays();
        a1.handle("tom","12345");

        System.out.println("==========================");

        Account a2 = new LoanOneMonth();
        a2.handle("tom","123456");
    }
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值