`
行者买刀
  • 浏览: 194541 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

设计模式之略见一斑(解释器模式Interpreter)

    博客分类:
  • J2SE
阅读更多

      解释器模式是一种比较难理解的模式,但如果你对Command(命令模式)和Composite(组合模式)很了解的话,你会发现其实解释器模式就是这两种的组合.为何要使用解释器模式,如何用解释器模式呢,这就是下面我们要分析的问题:

       

1.与Command命令模式区别

首先,让我们先区别一下它与Command(命令模式的区别)

   1)解释器模式的意图在于使开发人员可以组合可执行对象,这些对象来自于对某公共操作提供各种解释的类层次结构。而命令模式的意图仅仅是一个对象中请求.

   2)第二,解释器模式能否作为命令使用?当然可以,可以说它是命令模式的子模式。个体应该使用哪种设计模式,取决于你的意图。如果是期望创建组合可执行对象的工具集就可采用解释器模式,如果是采用请求封装在对象中就可采用命令模式。

 

2.与Composite(组合模式)区别

  Interpreter模式也类似于组合模式,Composite模式通常会为单个对象和群组对象定义一个公共接口。不过,Composite模式并不要求支持不方式组织的结构,尽管该模式可以支持这些结构。而解释器模式通常会涉及不同类开的组合结构(所以说interpreter通常处于Composite模式之上)。

 

Interpreter模式的意图是可以按照自己定义的组合规则集合来组合可执行对象

 

下面就讲一个我们日常最经常碰到的实例:

 

   如一个公司有如下层次总裁(President),老板(Boss),项目经理(Manager),员工(Employee)

一天,总裁接到一个邀请开发一套医疗管理系统,于是它就把老板叫来跟他简单说一下大概,然后就把相关事情交给老板了。

   老板接到任务之后,看了看,就挑了一个精明能干的开发四部项目经理(***)去安排。四部经理拿到任务之后,立即对任务进行安排.

 

设计图示如下:



 

上面的故事中都体现着一个意思就是每个层次都是根据上级的指令进行安排任务,所以我们就定义一个接口为Command

用于接收并传递指令给相应的下一级

 

/**
 * 命令接口
 * @author Administrator
 *
 */
public interface Command {
	public void execute(String order);
}

 

总裁(president)是最上一级的人物,他收到任务之后只要把老板叫过来,并把东西丢给他,然后就是拍拍屁股出去溜达去了

/**
 * 总裁
 * @author Administrator
 *
 */
public class President  extends Human implements Command{
	private Boss boss;
	private String order;
	
	public Boss callBoss(){
		
		boss = new Boss();
		return boss;
	}
	public void execute(String order) {
		this.order = order;
		boss.execute(order);
	}

}

 

老板收到总裁的命令之后,他必须选择一个能够用途这个任务的经理,所以他要做的就是如何去找一个能干的人并把任务交给它,然后就是给他施压..

/**
 * 老板
 * @author Administrator
 *
 */
public class Boss  extends Human implements Command{
	private static List<Manager> managers = new ArrayList<Manager>();
	private Manager devManager;
	private String order;
	static{
		for(int i =0;i<10;i++)
		managers.add(new Manager());
	}
	public void serviceForPresident(){
		devManager.execute(order);
	}
	public void execute(String order) {
		//..经过分析讨论,让开发四部去开发这套系统
		this.order = order;
		devManager  = managers.get(3);
		serviceForPresident();
	}

}

 

这聪明的老板选择项目经理之后,也就没他的事了,平时也就看看项目进展如何,然后陪总裁出去FB了。接下来的任务就是项目经理怎么去应对这些事情了。PM收到任务之后就开始对任务进行安排,对总体进行计划。他首先把客户找来,安排DBA进行数据分析,找文档撰写者开发文档,然后给领导评审。接着就是开发....然后继续交互,这样的敏捷式开发直到项目OVER啦。

public class Manager  extends Human implements Command{
	private static List<Employee> employees = new ArrayList<Employee>();
	private Employee dba;
	private Employee docs;
	private List<Employee> tests;
	private List<Employee> engineers;
	private String order;
	static{
		employees.add(new Employee("dba"));
		employees.add(new Employee("docs"));
		for(int i =2;i<10;i++){
			employees.add(new Employee("tests"));
		}
		for(int i =11;i<100;i++){
			employees.add(new Employee("engineers"));
		}
	}
	/**
	 * 分配给员工任务
	 *
	 */
	public void serviceForBoss(){
		dba.execute(order);
		docs.execute(order);
		for(Employee test:tests)
			test.execute(order);
		for(Employee engineer:engineers)
			engineer.execute(order);
	}
	public void execute(String order) {
		//....老板叫同仁们开发一套医疗软件,大家努力吧
		//分配具体任务需求分析,概要,DB等人员分工
		this.order = order;
		dba = employees.get(0);
		docs= employees.get(1);
		tests = employees.subList(2, 10);
		engineers = employees.subList(11, 30);
		serviceForBoss();
	}

}

 

接下来就是我们这辛苦的民工们了,能做的就是响应Manager的命令进行开发

/*
 *员工 
 */
 public class Employee  extends Human implements Command{
	private String role;
	private String order;
	public Employee(String role){
		this.role = role;
	}
	public Employee( ){
	}
	public void serviceForManager(){
		System.out.println("领导叫我们:"+order+",大家开始干活!"+" role:"+role);
	}
	public void execute(String order) {
		this.order = order;
		serviceForManager();
	}

}

 

 

 

测试方法如下:

 

public class Test {
	public static void main(String[] args) {
		//总裁
		President president = new President();
		Boss boss = president.callBoss();//把老板叫过来让它去开发医疗系统,然后就没有总裁的事了,接下来就得老板去做了
		president.execute("开发医疗系统");

	}
}

 

解释器,语言和解析器 

    解释器模式意在强调解释器的工作方式,但是它并没有指定如何在运行时组合或者实例化它们。在本章,我们通过编写JAVA代码来“手工”生成新的解释器。但是创建一个新的解释器常见的方法就是使用解析器。解析器对象可以按照预定规则识别文本和分解文本结构,以便于进一步处理。比如,你可以编写一个解析器,用它创建一个对应到早期伪代码形式文本程序的机器命令解释对象。 

 

 

总结:

    典型的解释器模式至少包含接口的两个子类。 该类层次结构中的每个类分别实现一个公共操作,如execute(String orader)方法。尽管前面没有讨论过,但这个方法需要一个“上下文”对象,用来保存重要的状态信息。

解释器模式同时也包括boolean或者自述表达式,它也经常使用解析器来简化新的解释器对象的创建过程。如上面的例子中,DBA员工正在开发系统,另一个项目正需要一个DBA,于是就有了如下:

public class IfCommand implements Command {
	protected Human human;

	protected Command ifbody;

	protected Command elsebody;

	public IfCommand(Human human, Command ifbody, Command elsebody) {
		this.human = human;
		this.ifbody = ifbody;
		this.elsebody = elsebody;
	}

	public void execute(String order) {
		if (!human.isBusy()) {
			ifbody.execute(order);
		} else {
			elsebody.execute(order);
		}
	}

}

 

为了节省资源,把首先DBA放着ifbody中,把备用DBA放入elsebody中,如果ifbody的DBA员工很忙的话,就请elsebody的DBA员工.

 

  • 大小: 53 KB
分享到:
评论
1 楼 whywen_MoJian 2010-04-13  
前面的命令模式感觉不错,但后面那部分就感觉对不上头!
可能是我对解析器械理解不深,

相关推荐

    21种设计模式略见一斑

    - 解释器模式:提供一个语言的文法表示,并定义一个解释器来解释该文法。 - 迭代器模式:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 状态模式:允许对象在其内部状态改变时改变其行为,看...

    设计模式之略见一斑(Observer观察者模式)

    在软件开发中,设计模式是解决常见问题的模板,它们为程序员提供了一种标准化的解决方案,使得代码更易于理解和维护。本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多...

    成语大全带解释.doc

    【成语大全带解释.doc】是一份详尽的文档,收录了大量的汉语成语及其解释。成语是中国文化中的重要组成部分,它们蕴含了丰富的历史故事、人生哲理和智慧。以下是一些成语的详细解读: 1. **和蔼可亲**:形容人的...

    2021-2025年中国避雷器行业调研及竞合策略研究报告.pdf

    该份报告题为《2021-2025年中国避雷器行业调研及竞合策略研究报告》,报告主要内容涉及避雷器行业在中国的发展现状、市场深度调研、企业竞合策略概述以及行业未来发展趋势等多个方面。 在标题中提到的“避雷器行业...

    小学语文成语大全及其解释.doc

    【小学语文成语大全及其解释】包含了500个常见的成语,每个成语都有详细的解释,旨在帮助小学生理解和掌握成语的含义和用法。这些成语涵盖了生活、情感、人物性格、历史故事等多个方面,对于提高学生的语言表达能力...

    小学语文成语大全及其解释.pdf

    以下是一些小学语文成语及其解释: 1. **和蔼可亲**:形容人性格温和,态度亲切,易于接近。 2. **唉声叹气**:因忧伤或烦恼而不断叹气,表达消极情绪。 3. **按兵不动**:军事策略,指挥官命令军队暂不行动,等待...

    CRC16或32校验

    CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑

    常用成语300个三百个成语解释.doc

    文档中的内容列举了300个常用的中文成语,并给出了它们的解释。这些成语是中国文化的重要组成部分,蕴含着丰富的智慧和历史典故。每个成语都具有独特的含义和应用场景,以下是一些成语的详细解读: 1. **好高鹜远**...

    小学生易错字及生僻字总结.doc

    6. 略见一斑:从一点细微之处就能看出整体的情况或品质。 7. 班门弄斧:在专家面前卖弄自己的技能,暗示自不量力。 8. 英雄辈出:形容一个时代或群体中不断涌现出杰出的人物。 9. 并行不悖:两件事物同时进行而互不...

    容易用错的成语一览表.doc

    以下是一些容易出错的成语及其详细解释,帮助理解正确用法。】 1. **和蔼可亲**:形容一个人态度温和,容易亲近。同义词有“平易近人”、“和颜悦色”。反义词如“气势汹汹”、“冷若冰霜”、“横眉怒目”。 2. **...

    怀念母亲练习题.docx

    - (3) "我当时的想法,从这几段文字中也可以看出一点" 可以替换为 "言外之意,略见一斑"。 2. 动词填空: - ① "暗夜渐渐__上天空,__上对面的屋顶" 可以填入 "爬上,爬满",表达夜晚降临的情景。"一切都__在朦胧...

    高一语文洞察世道沧桑测试[精选].doc

    - 《红楼梦》是中国古代四大名著之一,属于章回体小说,现有120回,前80回由曹雪芹创作,后40回一般认为是高鹗续写。曹雪芹,原名霑,字梦阮。《红楼梦》以贾、史、王、薛四大家族的兴衰为背景,以贾宝玉和林黛玉的...

    2015_2016学年高中语文课时训练10雷雨鲁人版必修4

    3. 字形校正:题目中还包含了错别字的纠正,如A项中的“烦燥”应为“烦躁”,“甜言密语”应为“甜言蜜语”,B项中的“半响”应为“半晌”,“略见一班”应为“略见一斑”,C项中的“脉膊”应为“脉搏”,“歪风斜气...

    曲周事业单位招聘2018年考试真题及答案解析考试版(1).docx

    "略见一斑"意味着事情的端倪已经显现,“光明灿烂”和“辉煌”均形容美好前景,但前者更侧重于未来的可能性,后者侧重于实际的辉煌成就。因此,选B:希望光明,光明璀璨。 8. 经济形势描述:第八题中,“内热外冷”...

    高一语文上册第二单元综合测试1[精选].doc

    1. 语文基础知识:题目涉及到词语辨析,如“心酸”与“辛酸往事”,“一般”与“略见一斑”,“过度”与“过渡时期”,“无谓”与“无私无畏”,“家世”与“处理家事”,“明智”与“淡泊明志”,“灌注”与...

    280个容易读错、写错、用错的成语要点.doc

    12. "略见一斑"(lüè jiàn yī bān):从部分看出整体,通过局部了解全局。 13. "暴虎冯河"(bào hǔ píng hé):形容有勇无谋,冒险行事。 14. "有口皆碑"(yǒukǒu jiē bēi):形容人人称赞,具有很高的...

    现场活动大屏幕系统v1.1806221.zip

    《现场活动大屏幕系统v1.1806221》是一款专为现场活动设计的多媒体展示系统,它的核心功能在于提供一个高效、稳定且易于操作的大屏幕展示平台。这款系统能够帮助活动组织者在活动现场实时展示各种信息,如活动进程、...

    《争吵》课件.ppt

    《爱的教育》的影响力之广泛,从它的翻译版本就能略见一斑。作为一部文学作品,它跨越国界和文化,成为全人类的精神财富。通过阅读《争吵》,学生不仅能够提升自己的语言表达能力,更能在情感和道德上得到深刻的教育...

    CRC算法与实现.doc

    例如,我们读软盘上的文件,以及解压一个 ZIP 文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 CRC 的优点 CRC 的优点在于编码和解码方法简单,检错和纠错能力强,在通信领域广泛地...

Global site tag (gtag.js) - Google Analytics