ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之禅——模板模式

2021-01-14 21:59:49  阅读:171  来源: 互联网

标签:之禅 悍马 void System println 设计模式 public 模板 out


什么是模板模式:

假如我是某某模型公司员工,在某种不可抗力的原因下,领导指派我在一个星期内完成10万悍马车辆模型的建设,但是10万确实是无法完成的,所以领导为了体谅我,给我降低了标准,只需要做出最基本的实现就可以了。
主要现在时间短但是工作量又巨大,怎么办?既然老板说了不考虑扩展性,先按照最一般的经验设计类图,按照需求,只需要悍马模型,那我们就写一个悍马模型的抽象类,比如说悍马有H1,H2两个型号,那就有两个不同型号的模型实现类,通过继承就可以实现业务要求。
那我们首先需要定义一个抽象类,悍马车模型:
start();启动车辆
stop();停止车辆
alarm();喇叭鸣叫
engineBoom();引擎轰鸣声
run();汽车跑起来
先编写抽象类的代码(即悍马模型代码)

public abstract class HummerModel {

    public abstract void start();//启动车辆

    public abstract void stop();//停止车辆

    public abstract void alarm();//喇叭鸣叫

    public abstract void engineBoom();//引擎轰鸣声

    public void run() {
        this.start();//首先启动车辆
        this.engineBoom();//然后可以听到引擎轰鸣声
        this.alarm();//在遇到问题时鸣笛示意
        this.stop();//到达目的地停车
    }//汽车跑起来

}

再编写两个实现类(即悍马H1模型和悍马H2模型)

public class HummerH1Model extends HummerModel{
    @Override
    public void start() {
        System.out.println("悍马H1启动");
    }

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

    @Override
    public void alarm() {
        System.out.println("悍马H1喇叭鸣叫");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H1引擎轰鸣");
    }
}

public class HummerH2Model extends HummerModel{
    @Override
    public void start() {
        System.out.println("悍马H2启动");
    }

    @Override
    public void stop() {
        System.out.println("悍马H2停止");
    }

    @Override
    public void alarm() {
        System.out.println("悍马H2喇叭鸣叫");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H2引擎轰鸣");
    }
}

我们准备好了一切,现在就需要给客户展示我们的成果了。
目前客户只要看H1型号的悍马车,没问题,生产出来,同时可以运行起来给他看看。

public class Test {
    public static void main(String[] args) {
        HummerModel h1 = new HummerH1Model();
        h1.run();
    }
}

代码运行结果如下:
在这里插入图片描述
这就是模板模式


模板模式的定义:

在我们刚刚举的那个例子中我们可以知道什么是模板模式,刚才的悍马车模型就叫做抽象模板,它的方法可以分为两类:
第一类叫做基本方法:也叫做基本操作,是由子类实现的方法,并且在模板方法被调用,就像上面那个例子中的start(),stop(),alarm(),engineBoom()方法。
第二类叫做模板方法:可以有一个或多个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑,就像上面例子中的run()方法。
在模板模式中还有另外一个角色:具体模板(即悍马H1模板和悍马H2模板),实现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。
那我们就可以根据前面的知识写出模板模型的通用代码;
抽象模板类:

public abstract class AbstractClass {
    public abstract void doSomething();
    public abstract void doAnything();
    public void templateMethod(){
        this.doSomething();
        this.doAnything();
    }
}

具体模板类:

public class ConcreteClass1 extends AbstractClass{
    @Override
    public void doSomething() {
        System.out.println("第一个具体模板的第一个基本方法");
    }

    @Override
    public void doAnything() {
        System.out.println("第一个具体模板的第二个基本方法");
    }
}

public class ConcreteClass2 extends AbstractClass{
    @Override
    public void doSomething() {
        System.out.println("第二个具体模板的第一个基本方法");
    }

    @Override
    public void doAnything() {
        System.out.println("第二个具体模板的第二个基本方法");
    }
}

实现类(即测试类)

public class Test {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        //调用模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

运行结果如下
在这里插入图片描述


模板模式的扩展:

现在老板通知我说,H1的客户想要车的喇叭响它就响,而H2的客户不想让车的喇叭不要有声音。那我们就要根据客户的具体要求进行修改。
如下所示:
修改后的抽象模板类:

public abstract class HummerModel {

    public abstract void start();//启动车辆

    public abstract void stop();//停止车辆

    public abstract void alarm();//喇叭鸣叫

    public abstract void engineBoom();//引擎轰鸣声

    public void run() {
        this.start();//首先启动车辆
        this.engineBoom();//然后可以听到引擎轰鸣声
        if(this.isAlarm()){
            this.alarm();
        }//在遇到问题时鸣笛示意
        this.stop();//到达目的地停车
    }//汽车跑起来

    public boolean isAlarm(){
        return true;
    }//默认喇叭会响
}

修改后的具体模板类:

public class HummerH1Model extends HummerModel{
    private boolean alarmFlag = true;//默认喇叭响
    @Override
    public void start() {
        System.out.println("悍马H1启动");
    }

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

    @Override
    public void alarm() {
        System.out.println("悍马H1喇叭鸣叫");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H1引擎轰鸣");
    }

    public boolean isAlarm(){
        return this.alarmFlag;
    }

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

public class HummerH2Model extends HummerModel{
    @Override
    public void start() {
        System.out.println("悍马H2启动");
    }

    @Override
    public void stop() {
        System.out.println("悍马H2停止");
    }

    @Override
    public void alarm() {
        System.out.println("悍马H2喇叭鸣叫");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H2引擎轰鸣");
    }

    public boolean isAlarm(){
        return false;
    }
}

修改后的测试类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    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();
        HummerH1Model h1 = new HummerH1Model();
        if(type.equals("0")){
            h1.setAlarm(false);
        }
        h1.run();
        System.out.println("悍马H2");
        HummerH2Model h2 = new HummerH2Model();
        h2.run();
    }
}

结果如下所示:
在这里插入图片描述
在这里插入图片描述


部分内容转载于《设计模式之禅》

标签:之禅,悍马,void,System,println,设计模式,public,模板,out
来源: https://blog.csdn.net/nakoaix/article/details/112626738

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有