美文网首页
二十五、解释器模式

二十五、解释器模式

作者: LeeLeCoder | 来源:发表于2017-08-08 22:42 被阅读0次

    1. 何为解释器模式

    解释器模式():给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

    正则表达式,浏览器都是解释器模式的应用。解释器模式类似百度翻译、模板引擎、加密算法等。

    解释器模式的使用场景一般都有以下特点:
    (1)需求不确定(对于百度翻译来说,输入的内容在开发时不能确定;对于加密算法,用户要加密什么内容也不确定;在编程时不知道,所以要动态代理。)
    (2)按规律来翻译内容。

    解释器模式如图1-1所示:

    图1-1 解释器模式

    2. 代码实现

    (1)解释器上下文环境

    @interface LLContext : NSObject
    
    @property (nonatomic, copy) NSString *input;
    @property (nonatomic, copy) NSString *output;
    
    - (instancetype)initWithInput:(NSString *)input;
    
    @end
    
    
    @implementation LLContext
    
    - (instancetype)initWithInput:(NSString *)input{
        self = [super init];
        if (self) {
            _input = input;
        }
        return self;
    }
    
    - (NSString *)output{
        return [NSString stringWithFormat:@"输入的是%@",_input];
    }
    
    @end
    

    (2)解释器抽象类

    @interface LLAbstractExpression : NSObject
    
    -(void)interpret:(LLContext *)context;
    
    @end
    
    
    @implementation LLAbstractExpression
    
    -(void)interpret:(LLContext *)context{
        return;
    }
    
    @end
    

    (3)解释器具体实现类

    @interface LLTerminalExpression : LLAbstractExpression
    
    @end
    
    @implementation LLTerminalExpression
    
    - (void)interpret:(LLContext *)context{
        NSLog(@"终端解释器,context == %@",context.output);
    }
    
    @end
    
    
    
    @interface LLNonterminalExpression : LLAbstractExpression
    
    @end
    
    @implementation LLNonterminalExpression
    
    - (void)interpret:(LLContext *)context {
        NSLog(@"非终端解释器,context == %@",context.output);
    }
    
    @end
    
    

    (4)客户端调用

    LLContext *context = [[LLContext alloc]initWithInput:@"12345"];
    NSMutableArray *list = [[NSMutableArray alloc]init];
        
    [list addObject:[[LLTerminalExpression alloc]init]];
    [list addObject:[[LLNonterminalExpression alloc]init]];
    [list addObject:[[LLTerminalExpression alloc]init]];
    [list addObject:[[LLTerminalExpression alloc]init]];
        
    for(LLAbstractExpression *exp in list) {
        [exp interpret:context];
    }
    

    相关文章

      网友评论

          本文标题:二十五、解释器模式

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