zoukankan      html  css  js  c++  java
  • 模板方法模式(Template Method)

    定义:
     
    定义一个模板结构,将具体内容延迟到子类去实现。
     
    解决的问题:
     
    • 提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
    • 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
     
     
    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();
        }

    输出

  • 相关阅读:
    手工解析.NET完全限定类型名称
    用Lambda表达式进行函数式编程(续):用C#实现Y组合子
    VS2008亮点:用Lambda表达式进行函数式编程
    用GPU通用并行计算绘制曼德勃罗特集图形 上篇
    Expression Tree上手指南 (一)
    用GPU通用并行计算绘制曼德勃罗特集图形 下篇
    .NET 4.0中的泛型协变和反变
    开发者眼里的WindowsPhone8的帐
    Win8 Metro App里玩XNA:框架问题解决方案
    Cocos2dx for WindowsPhone:一个按钮走天下
  • 原文地址:https://www.cnblogs.com/amei0/p/8057693.html
Copyright © 2011-2022 走看看