java 模板方法设计模式

一、前言:

      在生活中,完成某件事情是需要多个步骤的,比如淘宝购物粗略分为:登录,选择商品,付款这三个步骤。对于登录和付款这两个步骤而言,用户的使用都是一样的操作,不同的地方在于挑选商品不一致。

      软件开发中也是一样,有的类的某个方法的实现,需要几个固定的步骤完成,对于该类的不同对象,有的步骤是不变的,有的步骤是大相径庭的,有的步骤可变可不变。这种情况就适用于模板设计模式。

二、定义:

      定义一个操作某种算法的框架,将一些步骤延迟到子类中。模板方法模式使得子类在不改变一个算法框架的前提下,对某个步骤实现个性化定义。

三、构成:

      模板设计模式中有两类方法:一种是模板方法,一种是步骤方法。模板方法即某种算法的方法步骤,都是通过调用步骤方法完成的;步骤方法即模板方法的每个阶段性方法,每个步骤方法完成某一特定的、完成总算法的一部分功能。步骤方法有三种类型:抽象方法(子类必须实现的方法,子类必须对其完成个性化定义)、最终方法(所有子类都是一样的)、钩子方法(父类给出默认实现,子类也可以重写的方法)。

四、需求:

     还是前言中的那样,假设用户只能通过一种方式登录,必须自定义选择商品以及可以选择支付方式~

五、项目结构:

六、详细代码:

1、模板类 Shopping:

package me.ele.template;

/**
 * @author LZJ
 * @create 2018-07-20 21:25
 **/
public abstract class Shopping {
    /**
     * 模板方法
     */
    public void byGoods() {
        login();
        selectGoods();
        pay();
    }

    /**
     * 子类不能重写的方法(最终方法;用户只能这样登录)
     */
    public final void login() {
        System.out.println("必须通过用户名密码登录");
    }

    /**
     * 子类必须重写的方法 (抽象方法在本例子中,每个用户都有自己自定义的选择方式)
     */
    protected abstract void selectGoods();

    /**
     * 子类可以重写也可以不重写 (钩子方法;用户可以使用其他方式登录)
     */
    public void pay() {
        System.out.println("默认使用支付宝支付");
    }

}

2、模板实现类 UserShopping1

package me.ele.template;

/**
 * @author LZJ
 * @create 2018-07-20 21:34
 **/
public class UserShopping1 extends Shopping {

    protected void selectGoods() {
        String name = getClass().getName();
        name = name.substring(name.lastIndexOf(".") + 1);
        System.out.println(name + "选择了一件以纯T恤衫");
    }

}

3、模板实现类 UserShopping2

package me.ele.template;

/**
 * @author LZJ
 * @create 2018-07-20 21:34
 **/
public class UserShopping2 extends Shopping {
    
    protected void selectGoods() {
        String name = getClass().getName();
        name = name.substring(name.lastIndexOf(".") + 1);
        System.out.println(name + "购买了一双耐克鞋");
    }

    @Override
    public void pay() {
        System.out.println("嘿嘿,我选择使用了银行卡支付");
    }
    
}

4、测试类

package me.ele.template;

/**
 * @author LZJ
 * @create 2018-07-20 21:36
 **/
public class Test {
    public static void main(String[] rgs){
        
        UserShopping1 userShopping1 = new UserShopping1();
        UserShopping2 userShopping2 = new UserShopping2();

        userShopping1.byGoods();
        System.out.println("--------分开--------");
        userShopping2.byGoods();
        
    }
}

5、结果:

猜你喜欢

转载自blog.csdn.net/qq_36898043/article/details/81138634