设计模式——模板方法模式

作者: 不学无数的程序员 | 来源:发表于2019-04-29 11:21 被阅读9次

    设计模式——模板方法模式

    定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类不改变算法结构即可冲定义该算法的某些特定步骤。

    模板方法模式介绍

    也许看定义有些懵逼,但是模板方法模式在设计模式中算是简单的了,仅仅使用了Java的继承机制。但是它的应用是非常广泛的。我们先举个简单的例子让大家对于模板方法模式有个直观的了解。

    模板方法模式

    里面有两个角色

    • 抽象模板角色:完成对于基本方法的封装,由子类实现。并有一个方法是模板方法对于基本方法的调用,完成固定的逻辑。
    • 具体模板角色:子类对于基本方法的完善,从而实现父类调用子类方法实现不同角色不同的内容。

    例如我们定义个抽象的汽车类,里面有汽车启动、停止、喇叭三个操作。但是每个汽车的这三个操作都是不同的。但是向客户演示的时候都是同样操作启动、停止、按喇叭。所以这就是一个典型的模板方法模式。

    abstract class AbstractCar{
        protected abstract void run();
        protected abstract void stop();
        protected abstract void alarm();
    
        public final void templateMethod(){
            run();
            stop();
            alarm();
        }
    }
    
    

    接下来定义两辆实际的汽车

    class BmwCar extends AbstractCar{
    
        @Override
        protected void run() {
            System.out.println("宝马 跑");
        }
    
        @Override
        protected void stop() {
            System.out.println("宝马 停");
    
        }
    
        @Override
        protected void alarm() {
            System.out.println("宝马 喇叭叫");
        }
    }
    
    
    class HmCar extends AbstractCar{
    
        @Override
        protected void run() {
            System.out.println("悍马 跑");
        }
    
        @Override
        protected void stop() {
            System.out.println("悍马 停");
        }
    
        @Override
        protected void alarm() {
            System.out.println("悍马 喇叭叫");
        }
    }
    
    

    所以在调用的时候根据不同的车创建不同的角色即可

            AbstractCar bmw = new BmwCar();
            bmw.templateMethod();
            AbstractCar hm = new HmCar();
            hm.templateMethod();
    
    

    抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或者方法尽量设置为protected类型。

    模板方法模式的优点

    • 封装不变部分,扩展可变部分:把认为不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。
    • 提取公共部分代码,便于维护:如果不将公共部分抽取到父类中,任由散乱分布,最后维护将会造成很大的困扰。
    • 行为由父类控制,子类实现:基本方法由子类实现,因此子类可以通过扩展的方式增加相应的功能。

    参考

    相关文章

      网友评论

        本文标题:设计模式——模板方法模式

        本文链接:https://www.haomeiwen.com/subject/cnzenqtx.html