解释器模式和迭代器模式提交
This commit is contained in:
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @Title: package-info
|
||||
* @Description: 解释器模式
|
||||
* @Version:1.0.0
|
||||
* @author pancm
|
||||
* @date 2018年8月8日
|
||||
*/
|
||||
package com.pancm.design.interpreter;
|
||||
135
src/main/java/com/pancm/design/iterator/IteratorTest.java
Normal file
135
src/main/java/com/pancm/design/iterator/IteratorTest.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @Title: package-info
|
||||
* @Description: 迭代器模式
|
||||
* @Version:1.0.0
|
||||
* @author pancm
|
||||
* @date 2018年8月8日
|
||||
*/
|
||||
package com.pancm.design.iterator;
|
||||
Reference in New Issue
Block a user