因为最近在看设计模式,所以来记录分享一下。
今天我分享的是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(){
//需要应用开发人员根据业务需求自己写,所以不稳定。
}
void step4(){
//同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;
void step3(){
// 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 void step2() override {
// do something
}
virtual void step4() override {
// do something..
}
};
int main(){
MainDialog dialog;
dialog.show();
return 0;
}
大家可以自行体会一下这样的妙用,就到这里,谢谢。
|