写给新手的设计模式教程——模版方法模式

时间:2021-07-24 16:38:49

零、写在前面

 

想写设计模式,是因为读完了《漫谈设计模式》,有颇多感触。

将自己对于设计模式的理解记录下来,一方面防止自己遗忘,另一方面也可以给新手们一些入门级的帮助。

如果你要我给你一个看下去的理由的话,那么我只说四个字——浅显易懂

设计模式本来是一个很简单的东西,但是被专家们一总结一归纳,就变成了一套一套的理论。

我觉得对于新手来说,最重要的是搞懂“是什么”和“为什么”,至于更深层的东西,等你实践得多了自然就懂了。

文中示例所用语言为python,简洁明了。

 

个人理解难免有些偏差,如果有错误欢迎大家指出,我会及时改正的。

也欢迎大家提出各种意见建议。

 

重复一遍——浅显易懂。至于到底多浅显易懂,请往下看吧。

 

一、什么是设计模式?

 

在没有设计模式的年代,程序员们编程的过程中发现了许多代码结构上的问题,所以他们总结出来了一些通用的解决方法,统称——设计模式。

你可以把设计模式理解成一种“固定套路”,就好像武术中的见招拆招一样,你学会了这些套路,那么当你写程序遇到问题的时候就可以直接照搬了。

当然,问题是无穷的,套路是有限的。所以设计模式只是一种通用的套路,真正牛逼的人都是自己开宗立派创造新套路。

 

二、如何学习设计模式?

 

这个设计模式能解决什么问题?

这个设计模式是怎么解决这个问题的?

如果你能回答上来这两个问题,那么恭喜你,你已经学会了这个设计模式。

与之相对应,我们学习的过程,就是回答这两个问题的过程。

 

三、第一个模式——模版方法模式

 

先来看问题:

class walk_to_park():    # 假设我们在家里,闲的没事想去公园玩会,那我们就走着去

    def open_the_door():  # 开门
        ...

    
    def walk():        # 走去公园
        ...



class drive_to_park():  # 假设我们在家里,突然微信摇到一个美女说约我们去公园!那得赶快开车去啊!

    def open_the_door():  # 开门
        ...

    def drive():      # 开车去公园
        ...

看注释大家应该已经明白这两个类都是干嘛的了吧。

问题很明显——代码重复。

我们在每个类当中都有一个开门方法,乍一看好像没什么,反正就两个类。但是如果我们有20个类、100个类呢?

你可能会说那我们复制一下就行了嘛!那么如果我们需要修改open_the_door()方法呢?很明显我们不可能去手动修改每一个类里的方法,既浪费时间又容易出错。

所以我们要使用第一种设计模式——模版方法模式。

 

看代码:

class go_out:

    def open_the_door():
        ...


class walk_to_park(go_out):

    def walk():
        ...

class drive_to_park(go_out):

    def drive():
        ...


justwalk = walk_to_park()
justwalk.open_the_door()
justwalk.walk()

justdrive = drive_to_park()
justdrive.open_the_door()
justdrive.drive()

我们把重复的代码提取出来,写到了一个新的类里,然后继承这个类。这样既不影响子类的功能,又消除了重复代码。

现在,无论我们有100个类还是100万个类,需要修改open_the_door()方法的时候都只需要修改go_out类中的这个方法就可以了。

很简单吧,其实设计模式就是这么个东西。

 

下次我们会学习单例模式。

 

最后,请你来回答这两个问题:

模版方法模式能解决什么问题?

模版方法模式是怎么解决这个问题的?