diff --git a/src/main/java/com/pancm/design/interpreter/InterpreterTest.java b/src/main/java/com/pancm/design/interpreter/InterpreterTest.java new file mode 100644 index 0000000..9c9b2bb --- /dev/null +++ b/src/main/java/com/pancm/design/interpreter/InterpreterTest.java @@ -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."); + } + } +} diff --git a/src/main/java/com/pancm/design/interpreter/package-info.java b/src/main/java/com/pancm/design/interpreter/package-info.java new file mode 100644 index 0000000..29ca058 --- /dev/null +++ b/src/main/java/com/pancm/design/interpreter/package-info.java @@ -0,0 +1,8 @@ +/** +* @Title: package-info +* @Description: 解释器模式 +* @Version:1.0.0 +* @author pancm +* @date 2018年8月8日 +*/ +package com.pancm.design.interpreter; \ No newline at end of file diff --git a/src/main/java/com/pancm/design/iterator/IteratorTest.java b/src/main/java/com/pancm/design/iterator/IteratorTest.java new file mode 100644 index 0000000..d7fdb6e --- /dev/null +++ b/src/main/java/com/pancm/design/iterator/IteratorTest.java @@ -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 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; + } + } + +} + + diff --git a/src/main/java/com/pancm/design/iterator/package-info.java b/src/main/java/com/pancm/design/iterator/package-info.java new file mode 100644 index 0000000..0586528 --- /dev/null +++ b/src/main/java/com/pancm/design/iterator/package-info.java @@ -0,0 +1,8 @@ +/** +* @Title: package-info +* @Description: 迭代器模式 +* @Version:1.0.0 +* @author pancm +* @date 2018年8月8日 +*/ +package com.pancm.design.iterator; \ No newline at end of file