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

2020-03-27  本文已影响0人  Zszen
大纲 小结
基础准则 基础准则
创建型模式 单例模式
- 原型模式
- 简单工厂模式
- 抽象工厂模式
- 建造者模式
结构型模式 代理模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 门面/外观模式
- 享元模式
- 组合模式
行为型模式 模板方法模式
- 策略模式
- 命令模式
- 职责链模式
- 状态模式
- 观察者模式
- 中介者模式
- 迭代器模式
- 访问者模式
- 备忘录模式
- 解释器模式

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

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

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

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
上一篇下一篇

猜你喜欢

热点阅读