php与设计模式-解释器模式

解释器模式

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

Demo

<?php 
   /**
    * Created by PhpStorm.
    */ 

   /**环境角色
    * Class PlayContent
    */ 
   class PlayContent 
   { 
       public $content; 
   } 

   /**抽象解析器
    * Class IExpress
    */ 
   abstract class IExpress 
   { 
       //-----------------解释器---------------- 
       public function Translate(PlayContent $play_content) 
       { 
           if(empty($play_content->content)) 
           { 
               return false;  
           } 
           $key=mb_substr($play_content->content,0,1); 
           $play_content->content=mb_substr($play_content->content,2); 

           $val=mb_substr($play_content->content,0,mb_strpos($play_content->content,' ')); 
           $play_content->content=mb_substr($play_content->content,mb_strpos($play_content->content,' ')+1); 

           return $this->Excute($key,$val); 
       } 

       public abstract function Excute($key,$val); 
   } 
   //------------------------具体解析器------------- 
   /**音符
    * Class MusicNote
    */ 
   class MusicNote extends IExpress 
   { 
       public function Excute($key,$val) 
       { 
           $note=""; 
           switch($key) 
           { 
               case "C": 
                   $note = "1"; 
                   break; 
               case "D": 
                   $note = "2"; 
                   break; 
               case "E": 
                   $note = "3"; 
                   break; 
               case "F": 
                   $note = "4"; 
                   break; 
               case "G": 
                   $note = "5"; 
                   break; 
               case "A": 
                   $note = "6"; 
                   break; 
               case "B": 
                   $note = "7"; 
                   break; 
           } 
           return $note; 
       } 
   } 

   /**音阶
    * Class MusicScale
    */ 
   class MusicScale extends IExpress 
   { 
       public function Excute($key,$val) 
       { 
           $scale=""; 
           switch($val) 
           { 
               case "1": 
                   $scale="低音"; 
                   break; 
               case "2": 
                   $scale="中音"; 
                   break; 
               case "3": 
                   $scale="高音"; 
                   break; 
           } 
           return $scale; 
       } 
   } 

$play_content=new PlayContent(); 
$play_content->content="O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 "; 
$interpreter=null; 
try 
{ 
   while(!empty($play_content->content)) 
   { 

       $str = mb_substr($play_content->content,0,1); 
       switch($str) 
       { 
           case "O": 
               $interpreter = new MusicScale(); 
               break; 
           case "C": 
           case "D": 
           case "E": 
           case "F": 
           case "G": 
           case "A": 
           case "B": 
           case "P": 
               $interpreter = new MusicNote(); 
               break; 
       } 
       echo $interpreter->Translate($play_content).'::'; 
   } 
} 
catch(Exception $e) 
{ 
   echo $e->getMessage(); 
} 

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值