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


    零、写在前面

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

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

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

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

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

    文中示例所用语言为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类中的这个方法就可以了。

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

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

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

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

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

  • 相关阅读:
    Python之数学(math)和随机数(random)
    《图解HTTP》读书笔记
    leetcode1008
    leetcode1007
    leetcode1006
    leetcode1005
    leetcode218
    leetcode212
    leetcode149
    leetcode140
  • 原文地址:https://www.cnblogs.com/numbbbbb/p/3618743.html
Copyright © 2020-2023  润新知