package cn.bunny.pattern11;

public class PaymentProcess {
    public static void main(String[] args) {
        ConcretePaymentProcess concretePaymentProcess = new ConcretePaymentProcess();
        concretePaymentProcess.startProcess();
    }

    // 抽象模板方法
    static abstract class AbstractPaymentProcess {

        /**
         * 开始流程
         */
        public void startProcess() {
            authenticationUser();
            checkBalance();
            executePayment();
            returnPayment();
        }

        /**
         * 验证用户身份
         */
        private void authenticationUser() {
            System.out.println("验证用户身份。。。");
        }

        /**
         * 检查余额
         */
        public abstract void checkBalance();

        /**
         * 执行支付
         */
        private void executePayment() {
            System.out.println("执行支付。。。");
        }

        /**
         * 返回支付结果
         */
        public abstract void returnPayment();
    }

    static class ConcretePaymentProcess extends AbstractPaymentProcess {

        /**
         * 检查余额
         */
        @Override
        public void checkBalance() {
            System.out.println("检查完成，我的余额还有：1999亿元");
        }

        /**
         * 返回支付结果
         */
        @Override
        public void returnPayment() {
            System.out.println("支付成功，我的余额还有：1994亿元");
        }
    }
}
