美文网首页
设计模式 - 23.解释器模式 [行为型模式]

设计模式 - 23.解释器模式 [行为型模式]

作者: Zszen | 来源:发表于2020-03-27 18:53 被阅读0次
    大纲 小结
    基础准则 基础准则
    创建型模式 单例模式
    - 原型模式
    - 简单工厂模式
    - 抽象工厂模式
    - 建造者模式
    结构型模式 代理模式
    - 适配器模式
    - 桥接模式
    - 装饰器模式
    - 门面/外观模式
    - 享元模式
    - 组合模式
    行为型模式 模板方法模式
    - 策略模式
    - 命令模式
    - 职责链模式
    - 状态模式
    - 观察者模式
    - 中介者模式
    - 迭代器模式
    - 访问者模式
    - 备忘录模式
    - 解释器模式

    给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

    如果有个游戏通过多个方面判定玩家等级, 那么如何得到最终结果呢
    下面是一个三星评价系统, 成绩, 时间和操作次数都被记录在了评价系统内

    后来我改为了四个评价系统, 增加了难度评价, 如果难度够高, 那么一样增加对用户的评价, 实际开发中, 你可以根据需求去改良这些评价的占比

    import abc
    import random
    
    class RankSystem:
        def __init__(self):
            self.score_rank = ScoreRank()
            self.time_rank = TimeRank()
            self.step_rank = StepRank()
            self.difficault_rank = DifficualtRank()
    
        def check(self, score, time, step, difficault):
            res = round((self.score_rank.check(score)+self.time_rank.check(time)+self.step_rank.check(step)+self.difficault_rank.check(difficault))/4)
            print('score %d time %d step %d difficual %s rank=%d'%(score, time , step, difficault, res))
            return res
    
    
    class IExpression(metaclass=abc.ABCMeta):
    
        def __init__(self):
            self.pool=[]
    
        def add(self, obj):
            self.pool.append(obj)
    
        def remove(self, obj):
            if obj in self.pool:
                self.pool.remove(obj)
    
        def clear(self):
            self.pool.clear()
    
        @abc.abstractmethod
        def check(self):
            pass
    
    class ScoreRank(IExpression):
        def check(self, score):
            if score>1000:
                return 3
            elif score>500:
                return 2
            else:
                return 1
    
    class StepRank(IExpression):
        def check(self, step):
            if step<10:
                return 3
            elif step<20:
                return 2
            else:
                return 1
    
    class TimeRank(IExpression):
        def check(self, time):
            if time<60:
                return 3
            elif time<120:
                return 2
            else:
                return 1
    
    class DifficualtRank(IExpression):
        def check(self, difficualt):
            if difficualt=='hard':
                return 3
            elif difficualt=='medium':
                return 2
            elif difficualt=='easy':
                return 1
            else:
                return 1
            
    if __name__ == '__main__':
        rs = RankSystem()
        for k in range(10):
            rs.check(score=random.randint(0,1500),time=random.randint(20,300), step=random.randint(0,30), difficault=random.choice(['easy','medium','hard']))
    

    结果

    score 1001 time 264 step 1 difficual medium rank=2
    score 687 time 28 step 2 difficual hard rank=3
    score 747 time 274 step 6 difficual hard rank=2
    score 1354 time 115 step 13 difficual easy rank=2
    score 1159 time 201 step 14 difficual medium rank=2
    score 31 time 167 step 24 difficual medium rank=1
    score 988 time 269 step 13 difficual hard rank=2
    score 653 time 300 step 26 difficual hard rank=2
    score 930 time 289 step 25 difficual easy rank=1
    score 575 time 166 step 2 difficual medium rank=2
    

    相关文章

      网友评论

          本文标题:设计模式 - 23.解释器模式 [行为型模式]

          本文链接:https://www.haomeiwen.com/subject/trgxuhtx.html