• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
山高我为峰
博客园    首页    新随笔    联系   管理    订阅  订阅
模板方法模式

Template Method lets subclassess redefine certain steps of an algorithm without changing
the algorithm's structure.
定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即
可重定义该算法的某些特定步骤
抽象模板中的方法分两类:
基本方法:也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。
模板方法:可以有一个或几个,一般是一个具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
【为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写】

//抽象模板类
    public abstract class AbstractClass{
        //基本方法
        protected abstract void doSomething();
        //基本方法
        protected abstract void doAnything();
        //模板方法
        public void templateMethod(){
            //调用基本方法,完成相关逻辑
            this.doAnything();
            this.doSomething();
        }        
    }
    
    public class ConcreteClass1 extends AbstractClass{
        protected void doAnything(){
            ....
        }
        
        protected void doSomething(){
            ....
        }
    }
    
    public class ConcreteClass2 extends AbstractClass{
        protected void doAnything(){
            ...
        }
        
        protected void doSomething(){
            ...
        }
    }
    
    public class Client{
        public static void main(String[] args){
            AbstractClass class1=new ConcreteClass1();
            AbstractClass class2=new ConcreteClass2();
            class1.templateMethod();
            class2.templateMethod();
        }
    }

 

模板方法模式的优点:
1.封装不变部分,扩展可变部分:把认为不变的部分封装到父类中实现,而可变部分则可以通过继承来扩展
2.提取公共部分的代码,便于维护
3.行为有父类控制,子类主管实现:基本方法是有子类实现,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则
缺点:按正常的设计习惯,抽象类负责声明最抽象,最一般的事物属性和方法,实现完成具体的事物属性和方法。但是模板方法模
式却是在抽象类中定义了部分抽象方法,由子类来实现,并且子类执行的结果会影响到父类的结构。

使用场景:
1.多个子类有共同的方法,并且逻辑基本相同时
2.在重要,复杂的算法中,可以把核心算法设计为模板方法,周边相关的细节功能则由各个子类实现
3.重构时,模板方法经常用到,把相同的代码抽象到父类中,然后通过钩子函数约束其行为

posted on 2016-05-05 12:04  山高我为峰  阅读(236)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3