Android设计模式

Android设计模式-14-模板方法模式

2018-06-12  本文已影响44人  今阳说

1. 定义

2. 应用场景

  1. 有多个子类共有的方法,且逻辑相同
  2. 重要的、复杂的方法,可以考虑作为模板方法

3. 优缺点

  1. 提高代码复用性
    将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
  2. 实现了反向控制
    通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”(1.封装不变部分,扩展可变部分;2. 行为由父类控制,子类实现)

4. Andorid源码中的使用

5. 实例演示

以电脑开机过程为例

  1. 首先创建一个电脑的抽象类, 其中包含了开机方法startUp以及几个相关的子步骤方法
abstract class Computer {
        //1.开机
        void powerOn() {
            LjyLogUtil.i("1.接入30v电源");
        }

        //2.硬件检查
        void checkHardware() {
            LjyLogUtil.i("2 检查硬件");
        }

        //3.载入操作系统
        abstract void loadOS();

        //4.登录
        void login() {
            LjyLogUtil.i("4.输入用户名密码登录");
        }

        //开机,固定步骤1,2,3,4;设为final防止被复写篡改
        public final void startUp() {
            LjyLogUtil.i(String.format("%s:-------开机start------", this.getClass().getSimpleName()));
            powerOn();
            checkHardware();
            loadOS();
            login();
            LjyLogUtil.i(String.format("%s:-------开机end------", this.getClass().getSimpleName()));
        }

    }
  1. 创建两个实现类,这里分别以苹果的MAC和戴尔的Dell为例
    //苹果的MAC
    class MacComputer extends Computer {

        @Override
        void powerOn() {
//            super.powerOn();
            LjyLogUtil.i("1.接入20.2v电源");
        }

        @Override
        void checkHardware() {
            super.checkHardware();
            LjyLogUtil.i("---> 2.2 检查硬件防火墙");
        }

        @Override
        void loadOS() {
            LjyLogUtil.i("3.载入mac系统");
        }

        @Override
        void login() {
//            super.login();
            LjyLogUtil.i("4.输入指纹登录");
        }
    }
    //戴尔的Dell
    class DellComputer extends Computer {

        @Override
        void loadOS() {
            LjyLogUtil.i("3.载入windows系统");
        }
    }
  1. 分别创建两个电脑实例,调用开机方法
private void methodTemplateMethodPattern() {
        MacComputer macComputer = new MacComputer();
        macComputer.startUp();
        LjyLogUtil.i("\n");
        DellComputer dellComputer = new DellComputer();
        dellComputer.startUp();
    }

上面的代码是非常简单的,主要是理解模版方法模式的思想,以及平时的使用场景

上一篇 下一篇

猜你喜欢

热点阅读