设计模式 - 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