解释器模式和迭代器模式提交

This commit is contained in:
xuwujing
2018-10-26 11:36:10 +08:00
parent 96ea3c3d42
commit c08627ac8c
4 changed files with 245 additions and 0 deletions

View File

@@ -0,0 +1,94 @@
package com.pancm.design.interpreter;
/**
* @Title: InterpreterTest
* @Description: 解释器模式
解释器模式Interpreter Pattern是类的行为模式。给定一个语言之后解释器模式可以定义出其文法的一种表示并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
* 比如正则表达式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
public class InterpreterTest {
/**
* @param args
*/
public static void main(String[] args) {
String word = "好好学习,天天向上!";
Expreeion expreeion =new BaiduExpreeion();
Expreeion expreeion2 =new YouDaoExpreeion();
Expreeion expreeion3 =new XuWuJingExpreeion();
expreeion.interpert(word);
expreeion2.interpert(word);
expreeion3.interpert(word);
/*
输出结果:
百度翻译:好好学习,天天向上! 的英文是 Study hard.
有道翻译:好好学习,天天向上! 的英文是 study hard and make progress every day
xuwujing翻译好好学习天天向上! 的英文是 Good good study, day day up.
*/
/*
应用实例:编译器、运算表达式计算。
优点: 1、可扩展性比较好灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。
使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用一种简单的语言来进行表达。 3、一个简单语法需要解释的场景。
*/
}
}
/*
* 定义一个表达式,有一个解释的方法
*/
interface Expreeion{
void interpert(String word);
}
class BaiduExpreeion implements Expreeion{
String str ="好好学习,天天向上!";
@Override
public void interpert(String word) {
//如果是这句就翻译
if(str.equals(word)) {
System.out.println("百度翻译:"+word+" 的英文是 Study hard.");
}
}
}
class YouDaoExpreeion implements Expreeion{
String str ="好好学习,天天向上!";
@Override
public void interpert(String word) {
//如果是这句就翻译
if(str.equals(word)) {
System.out.println("有道翻译:"+word+" 的英文是 study hard and make progress every day");
}
}
}
class XuWuJingExpreeion implements Expreeion{
String str ="好好学习,天天向上!";
@Override
public void interpert(String word) {
//如果是这句就翻译
if(str.equals(word)) {
System.out.println("xuwujing翻译"+word+" 的英文是 Good good study, day day up.");
}
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 解释器模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.interpreter;

View File

@@ -0,0 +1,135 @@
package com.pancm.design.iterator;
import java.util.ArrayList;
import java.util.List;
/**
* @Title: IteratorTest
* @Description: 迭代器模式 迭代器模式Iterator Pattern是 Java 和 .Net
* 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。
* 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
public class IteratorTest {
public static void main(String[] args) {
MyIterable myIterable = new ListContainer();
myIterable.add("1");
myIterable.add("zhangsan");
myIterable.add("2");
myIterable.add("lisi");
myIterable.add("3");
myIterable.add("xuwujing");
MyIterator myIterator = myIterable.getIterator();
while (myIterator.hasNext()){
String str = myIterator.next();
System.out.println(str);
}
/*
输出结果:
1
zhangsan
2
lisi
3
xuwujing
*
*/
/*
*
* 优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。
* 4、在迭代器模式中增加新的聚合类和迭代器类都很方便无须修改原有代码。
*
* 缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
*
* 使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
*
* 注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
*
适用
访问一个聚集对象的内容而无需暴露它的内部表示;
支持对聚集对象的多种遍历(如: 不光可以正向遍历, 还可以反向遍历容器元素.);
为遍历不同的聚合结构提供一个统一的接口(即: 支持多态迭代).
Iterator使用场景不必多言, 由于Java已经将其固化到语言中,因此开发中天天都在使用:
当需要访问一个聚集对象, 且不需要了解其内部实现的时, 就应该考虑使用迭代器模式.
当需要对聚集有多种方式遍历时, 可以考虑使用迭代器模式.
*/
}
}
/*
* 定义一个Iterator
*/
interface MyIterator {
//判断是否还有下一个
boolean hasNext();
//返回信息
String next();
}
/*
* 定义一个Iterable
*/
interface MyIterable{
MyIterator getIterator();
void add(String str);
String get(int index);
}
class ListContainer implements MyIterable {
private List<String> list =new ArrayList<>();
@Override
public MyIterator getIterator() {
return new ListIterator();
}
@Override
public void add(String str) {
list.add(str);
}
@Override
public String get(int index) {
return list.get(index);
}
class ListIterator implements MyIterator{
int index;
@Override
public boolean hasNext() {
return index < list.size();
}
@Override
public String next() {
if (this.hasNext()) {
return list.get(index++);
}
return null;
}
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 迭代器模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.iterator;