denislov 发表于 2020-2-16 23:10

设计模式之template method

因为最近在看设计模式,所以来记录分享一下。
今天我分享的是23种设计模式中的template method模式。先来看看我们啥时候会对这种模式产生需求。
我们在很多场景中会遇到这种模式。比如说android开发里四大组件之Activity,当我们写一个活动类的时候都会去继承这个Activity类,你应该发现了,我们会去override它的一些方法,比如说onCreate(),onStart(),onStop(),onDestroy(),等等。
但我们并不知道一个Activity从头到尾到底是如何运行,只知道在特定的时候Activity提供了一些我们可以override的接口。这里我们可以得知,它的从头到尾如何运行出来的算法是稳定的,而当中不稳定的地方就是我们重写的那些子模块,如上的那些onCreate()等等。
在面对对象windows开发当中,很多人也会发现这个现象,就是你写一个程序依赖与一个库,而这个库只是让你实现它指定的部分,而它内部的逻辑却看不到。
我们看个代码,不过只是伪码,当然,大家应该能看明白。
```
// 库开发人员提供的一个库
class Library{
public:
void step1(){
// do somethings... 稳定的
}
void step3(){
// do somethings... 稳定的
}
};
// 应用开发人员写主函数
void step2(){
//需要应用开发人员根据业务需求自己写,所以不稳定。
}
voidstep4(){
//同step2()
}
int main(){
   Library lib;
   //算法代码块
   lib->step1();
   if (step2())
    {
          step3();
          for (int i= 0;i<4;i++)
         step4();
   }
//假如通过这几个步骤,即这个算法能显示一个dialog。是一个相对稳定的部分.
 return 0;
}
```
现在我们看这个代码,其实设计模式就是不稳定中把稳定的剥离出来。这个例子很短,可能大家觉得没必要找出啥稳定的部分。比如说库开发人员提供了一个业务功能,该功能实现起来的算法十分麻烦,但其中逻辑十分稳定,并且你实际也无需知道算法具体能容,只是希望库能提供一些接口让你实现功能部分的自定义,这时候就需要template method了,看代码:
```
class Library {
public :
void step1(){
//do something...
}
virtual void step2() = 0;
voidstep3(){
// do something...
}
virtual void step4() = 0;
void show(){
step1();
if (step2())
{
      step3();
      for (int i= 0;i<4;i++)
      step4();
}
}
};

class MainDialog :public Library{
   virtual voidstep2() override {
   // do something
   }
   virtual void step4() override {
      // do something..
   }
};


int main(){
   MainDialog dialog;
   dialog.show();
   return 0;
}
```
大家可以自行体会一下这样的妙用,就到这里,谢谢。

fight775 发表于 2020-2-16 23:35

刚好准备学设计模式,题主加油

denislov 发表于 2020-2-16 23:37

fight775 发表于 2020-2-16 23:35
刚好准备学设计模式,题主加油

回城里了有电脑了,我会写具体点:lol

wd12aa 发表于 2020-2-17 00:48

系统学习更好,这个得有基础吧

denislov 发表于 2020-2-17 01:39

wd12aa 发表于 2020-2-17 00:48
系统学习更好,这个得有基础吧

其实设计模式的代码很容易看懂,但如何做到有一个好的面向对象设计很难

wd12aa 发表于 2020-2-20 00:25

denislov 发表于 2020-2-17 01:39
其实设计模式的代码很容易看懂,但如何做到有一个好的面向对象设计很难

哦,谢谢
页: [1]
查看完整版本: 设计模式之template method