zoukankan      html  css  js  c++  java
  • 浅谈Python设计模式

      

      声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。

      在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对工厂方法进一步抽象化,用于工厂方法本身也需要抽象集中管理的情况。

     从工厂模式我们可以知道:

       根据用户输入的不同,调用相同的工厂,将会输出不同的结果。

     那么抽象工厂模式呢?

       根据用户输入的不同,调用相同的接口,去调用不同的工厂进行不同的生产,得出不同的输出结果。(个人理解)

      例如:

      在编写一款面向全年龄的游戏,游戏本身需要使用工厂方法进行开发。但游戏也需要考虑不同年龄段玩家的需求和口味不同,所以需要为不同年龄段的玩家针对游戏进行一定的修改。于是在用户输入年龄后,运行符合其年龄的要求的游戏。

      代码(来自《精通Python设计模式》)

      

    class Frog(object):
        '''青蛙类'''
        def __init__(self,name):
            self.name = name
    
        def __str__(self):
            return self.name
        
        def interact_with(self,obstacle):
            print('{} the Frog encounters {} and {} !'.format(self,obstacle,obstacle.action()))
    
    class Bug(object):
        '''臭虫类'''
        def __str__(self):
            return 'a bug'
        def action(self):
            return 'eats it'
    
    
    class FrogWorld(object):
        '''抽象工厂-青蛙世界'''
        def __init__(self,name):
            print(self)
            self.player_name = name
    
        def __str__(self):
            return '----------welcome to FrogWorld-------------'
    
        def make_character(self):
            return Frog(self.player_name)
        
        def make_obstacle(self):
            return Bug()
        
    
    class Wizerd(object):
        '''巫师类'''
        def __init__(self,name):
            self.name = name
        
        def __str__(self):
            return self.name
        
        def interact_with(self,obstacle):
            print('{} the Wizerd battles against {} and {} !'.format(self,obstacle,obstacle.action()))
    
    
    class Ork(object):
        '''怪兽类'''
        def __str__(self):
            return 'an evil ork'
        
        def action(self):
            return 'kills it'
    
    class WizerdWorld(object):
        '''抽象工厂-巫师世界'''
        def __init__(self,name):
            print(self)
            self.player_name = name
    
        def __str__(self):
            return '--------welcome to WizerdWorld-------------------'
        
        def make_character(self):
            return Wizerd(self.player_name)
        
        def make_obstacle(self):
            return Ork()
    
    
    class GameEnvironment(object):
        '''游戏主入口'''
        def __init__(self,factory):
            self.hero = factory.make_character()
            self.obstacle = factory.make_obstacle()
    
        def play(self):
            self.hero.interact_with(self.obstacle)
    
    
    def validata_age(name):
        '''验证年龄'''
        try:
            age = input('welcome {}, How old are you?'.format(name))
            age = int(age)
        except Exception as e:
            print('Age {} is invalid,please try again...'.format(age))
            return(False,age)
        return(True,age)
    
    
    
    def main():
        name = input("Hello,What's you name?")
        valid_input = False
        while not valid_input:
            valid_input,age = validata_age(name)
        game = FrogWorld if age<18 else WizerdWorld
        environment =GameEnvironment(game(name))
        environment.play()
    
    
    
    if __name__ == '__main__':
        main()
        print('hello world')

      解析:

      1、通过一个 GameEnvironment 去管理两个游戏:FrogWorld、WizerdWorld ,根据用户输入的不同的年龄去决定其去玩那个游戏,是青蛙世界还是巫师世界呢?

      2、而每个游戏类即 FrogWorld、WizerdWorld ,又分别管理着 两个角色 --(Frog青蛙、Bug臭虫)和(Wizerd巫师、Ork怪兽)

      其实无论是工厂模式和抽象工厂模式的思想都是一样的,根据不同的输入,调用相同的接口,得出不同的结果。其内部封装了操作流程,用户无需知道其内部如何其实现的如何进行选择,只管输入便可的得到结果。

      over~~~~

  • 相关阅读:
    我对JavaWeb中中文URL编码的简单总结
    URL的编码和解码
    Maven警告解决:Using platform encoding (UTF-8 actually)
    JavaWeb编码浅解
    pageContext对象的用法详述
    JspSmartUpload 简略使用
    Web开发相关笔记 #05# MySQL中文无法匹配
    Web开发相关笔记 #04# WebSocket
    Eloquent JavaScript #02# program_structure
    Eloquent JavaScript #01# values
  • 原文地址:https://www.cnblogs.com/littlefivebolg/p/9928174.html
Copyright © 2011-2022 走看看