设计模式理解:模板方法

模板方法属于类行为型模式,通常定义出一个稳定的骨架,特定的内容的实现延迟至子类中去实现。

在模板方法的实现思想:将稳定的部分实现,把容易变化的部分开放给实际使用者实现。

模板方法的常见例子:继承,虚函数等。

例如在JAVA像利用线程实现下载功能,你只需要定义一个线程实现run方法就行。对于Library开发者不需要去实现不同功能的线程,把线程的功能实现留给实际应用的开发者。Library开发者只需要实现线程的系统调度等稳定的操作就可以,这就是“实现稳定,开放变化”。当然对于应用开发者,就要自行去实现“变化的部分”,功能稳定部分的实现逻辑对于应用开发者是一个“黑匣子”。对于JAVA线程使用来说,开发者只需要知道在run方法写入下载功能就能够同时达到“并发,共享进程资源”的特点。

例如在一个计算图形的面积的应用程序中已有矩形和三角形的面积计算功能,现有一个“增加圆形计算面积的功能”的需求。

一种实现方式是“每个图形都定义一个独立的类”,第二种是‘定义一个图形抽象类,让各个图形继承该抽象类。“

---------- 实现方式1-------------
class rectangular{
    ....
 double area(){.....}
}
class triangle{
    ....
 double area(){.....}
}

int main(){
    
    if(type == "rectangular"){
         rectangular  r1;
         ...
         r1.area() ; 
    }else if(type =='triangle'){
         triangle  t1;
         ...
         t1.area();
    }
    return 0 ;
}

---------- 实现方式2-------------
class shape{
    ...
 double area()=0;
}
class rectangular:public shape{
    ...
 double area(){.....}
}
class triangle:public shape{
    ...
 double area(){.....}
}

int main(){
    rectangular  r1;
    ...
    r1.area() ; 
   
    return 0 ;
}

显然,前一种方式面对这个需求新增,不仅需要创建一个类实体,而且实现流程还需要根据具体类型来变更main方法中的流程。而在第二中方式中,Library 开发人员负责实现 shape 类的定义和main方法的实现,实际应用开发人员只需要创建一个继承shape 的类就可以完成这个需求。

模板方法主要关注的就是“变化”和“稳定”。把两者中划分出来,将变化的部分抽离开,是这模板方法思想的关键。

当然,如果功能骨架中的每一步都是变化的,或者从头到尾都是稳定的,那就不要用模板方法了。

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/113957043