Design Patterns: Метод шаблона

Метод шаблона определяет структуру для работы алгоритма, некоторые шаги для подклассов задержать. Подклассы не могут изменить такой алгоритм определенной конфигурации определенных шагов алгоритма переопределять

Главная роль методы шаблона

Here Вставка рисунка Описание

Шаблон Метод шаблон с использованием Java механизм наследования, который, AbstractClass назвал абстрактный шаблон , его методы делятся на две категории:

  • Основные методы: по подклассу достичь, и называются шаблонным методом
  • Шаблон Метода: Основной метод диспетчеризации реализована, в основных логиках

ConcreteClass1 и принадлежит ConcreteClass2 определенного шаблону , основной метод , как это определенно в реализации родительского класса

2, для достижения методы шаблона

//抽象模板类
public abstract class AbstractClass {
    //基本方法
    protected abstract void doSomething();

    //基本方法
    protected abstract void doAnything();

    public void templateMethod() {
        //调用基本方法,完成相关逻辑
        this.doAnything();
        this.doSomething();
    }
}
//具体模板类
public class ConcreteClass1 extends AbstractClass {
    @Override
    protected void doSomething() {
        //业务逻辑
    }

    @Override
    protected void doAnything() {
        //业务逻辑
    }
}
//具体模板类
public class ConcreteClass2 extends AbstractClass {
    @Override
    protected void doSomething() {
        //业务逻辑
    }

    @Override
    protected void doAnything() {
        //业务逻辑
    }
}
public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        //调用模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

3, расширенный метод шаблона

Бизнес-логика заключается в следующем: модели H1 Hummer может контролировать ли он громкий рог

//抽象模板类
public abstract class HummerMode {
    protected abstract void start();

    protected abstract void stop();

    protected abstract void alarm();

    protected abstract void engineBoom();

    final public void run() {
        //发动汽车
        this.start();
        //引擎开始轰鸣
        this.engineBoom();
        //汽车喇叭响
        if (isAlarm()) {
            this.alarm();
        }
        //到达目的地停车
        this.stop();
    }

    //钩子方法,默认喇叭是会响的
    protected boolean isAlarm() {
        return true;
    }
}
//具体模板类
public class HummerH1 extends HummerMode {
    private boolean alarmFlag = true;//要响喇叭

    public void setAlarm(boolean isAlarm) {
        this.alarmFlag = isAlarm;
    }

  	//重写钩子方法,通过子类方法返回值决定公共部分的执行结果
    @Override
    protected boolean isAlarm() {
        return this.alarmFlag;
    }

    @Override
    protected void start() {
        System.out.println("悍马H1发送...");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H1停车...");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H1鸣笛...");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H1引擎发动...");
    }
}
public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("H1型号悍马");
        System.out.println("H1型号悍马是否需要喇叭声响? 0-不需要 1-需要");
        String type = new BufferedReader(new InputStreamReader(System.in)).readLine();
        HummerH1 h1 = new HummerH1();
        if (type.equals("0")) h1.setAlarm(false);
        h1.run();
    }
}

результат операции ввода 0 следующим образом:

H1型号悍马
H1型号悍马是否需要喇叭声响? 0-不需要 1-需要
0
悍马H1发送...
悍马H1引擎发动...
悍马H1停车...

Результат выполнения входа 1 следующим образом:

H1型号悍马
H1型号悍马是否需要喇叭声响? 0-不需要 1-需要
1
悍马H1发送...
悍马H1引擎发动...
悍马H1鸣笛...
悍马H1停车...
Он опубликовал 183 оригинальных статей · похвала 414 Выигранные · просмотров 90000 +

рекомендация

отblog.csdn.net/qq_40378034/article/details/104112759