首页 > 其他 > 详细

模板方法模式(Template Method)

时间:2017-12-18 17:11:17      阅读:222      评论:0      收藏:0      [点我收藏+]
定义:
 
定义一个模板结构,将具体内容延迟到子类去实现。
 
解决的问题:
 
  • 提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
  • 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
 
 
uml类图:
技术分享图片
 
 
模式组成:
 
  • AbstractClass:抽象类。实现了模板方法,定义了算法的骨架
  • ConcreteClass:具体类。实现抽象类中的抽象方法,已完成完整的算法
 
优点:
 
  • 提高代码复用性
将相同部分的代码放在抽象的父类中
  • 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
  • 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
 
 
缺点:
 
  • 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度

 

举个栗子:

定义抽象角色

abstract class AbstractPerson {
    public void prepareGotoSchool() {
        dressup();
        eatBreakfast();
        takeThings();
    }

    void dressup() {
        System.out.println("穿衣洗漱");
    }

    protected abstract void eatBreakfast();

    protected abstract void takeThings();
}

定义具体实现

class Student extends AbstractPerson {
    @Override
    protected void eatBreakfast() {
        System.out.println("吃妈妈做好的早餐");
    }

    @Override
    protected void takeThings() {
        System.out.println("背书包,带好作业去学校");
    }
}

定义具体实现

class Teacher extends AbstractPerson {
    @Override
    protected void eatBreakfast() {
        System.out.println("做早饭,并照顾孩子吃早饭");
    }

    @Override
    protected void takeThings() {
        System.out.println("带上昨晚准备的试卷");
    }
}

客户端调用

public static void main(String[] args) {
        Student s = new Student();
        Teacher t = new Teacher();
        s.prepareGotoSchool();
        System.out.println("=============");
        t.prepareGotoSchool();
    }

输出

技术分享图片

模板方法模式(Template Method)

原文:http://www.cnblogs.com/amei0/p/8057693.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!