Skip to content

Commit efc1088

Browse files
committed
Java设计模式
1 parent f1286d8 commit efc1088

28 files changed

+443
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.util.HashMap;
4+
5+
public class AddExpression extends SymbolExpression {
6+
public AddExpression(Expression left, Expression right) {
7+
super(left, right);
8+
}
9+
10+
//把左右两个表达式运算的结果加起来
11+
public int interpreter(HashMap<String, Integer> var) {
12+
return super.left.interpreter(var) + super.right.interpreter(var);
13+
}
14+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.util.HashMap;
4+
import java.util.Stack;
5+
6+
public class Calculator {
7+
//定义表达式
8+
private Expression expression;
9+
10+
//构造函数传参,并解析
11+
public Calculator(String expStr) {
12+
//定义一个栈,安排运算的先后顺序
13+
Stack<Expression> stack = new Stack<>();
14+
//表达式拆分为字符数组
15+
char[] charArray = expStr.toCharArray();
16+
//运算
17+
Expression left;
18+
Expression right;
19+
for (int i = 0; i < charArray.length; i++) {
20+
switch (charArray[i]) {
21+
case '+': //加法
22+
//加法结果放到栈中
23+
left = stack.pop();
24+
right = new VarExpression(String.valueOf(charArray[++i]));
25+
stack.push(new AddExpression(left, right));
26+
break;
27+
case '-':
28+
left = stack.pop();
29+
right = new VarExpression(String.valueOf(charArray[++i]));
30+
stack.push(new SubExpression(left, right));
31+
break;
32+
default: //公式中的变量
33+
stack.push(new VarExpression(String.valueOf(charArray[i])));
34+
}
35+
}
36+
//把运算结果抛出来
37+
this.expression = stack.pop();
38+
}
39+
40+
//开始运算
41+
public int run(HashMap<String, Integer> var) {
42+
return this.expression.interpreter(var);
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.util.HashMap;
4+
5+
public abstract class Expression {
6+
//解析公式和数值,其中var中的key值是公式中的参数,value值是具体的数字
7+
public abstract int interpreter(HashMap<String, Integer> var);
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.util.HashMap;
4+
5+
public class SubExpression extends SymbolExpression {
6+
public SubExpression(Expression left,Expression right){
7+
super(left,right);
8+
}
9+
//左右两个表达式相减
10+
public int interpreter(HashMap<String, Integer> var) {
11+
return super.left.interpreter(var) - super.right.interpreter(var);
12+
}
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
public abstract class SymbolExpression extends Expression {
4+
protected Expression left;
5+
protected Expression right;
6+
7+
//所有的解析公式都应只关心自己左右两个表达式的结果
8+
public SymbolExpression(Expression left, Expression right) {
9+
this.left = left;
10+
this.right = right;
11+
}
12+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.util.HashMap;
4+
5+
public class VarExpression extends Expression {
6+
7+
private String key;
8+
9+
public VarExpression(String key) {
10+
this.key = key;
11+
}
12+
13+
//从map中取之
14+
public int interpreter(HashMap<String, Integer> var) {
15+
return var.get(this.key);
16+
}
17+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.heibaiying.behavioral.interpreter;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.HashMap;
7+
8+
public class ZTest {
9+
//运行四则运算
10+
public static void main(String[] args) throws IOException {
11+
String expStr = getExpStr();
12+
//赋值
13+
HashMap<String, Integer> var = getValue(expStr);
14+
Calculator cal = new Calculator(expStr);
15+
System.out.println("运算结果为:" + expStr + "=" + cal.run(var));
16+
}
17+
18+
//获得表达式
19+
public static String getExpStr() throws IOException {
20+
System.out.print("请输入表达式:");
21+
return (new BufferedReader(new InputStreamReader(System.in))).readLine();
22+
}
23+
24+
//获得值映射
25+
public static HashMap<String, Integer> getValue(String exprStr) throws IOException {
26+
HashMap<String, Integer> map = new HashMap<String, Integer>();
27+
//解析有几个参数要传递
28+
for (char ch : exprStr.toCharArray()) {
29+
if (ch != '+' && ch != '-') {
30+
//解决重复参数的问题
31+
if (!map.containsKey(String.valueOf(ch))) {
32+
String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
33+
map.put(String.valueOf(ch), Integer.valueOf(in));
34+
}
35+
}
36+
}
37+
return map;
38+
}
39+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.heibaiying.behavioral.iterator;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class Book {
7+
private String name;
8+
9+
public Book(String name) {
10+
this.name = name;
11+
}
12+
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.heibaiying.behavioral.iterator;
2+
3+
import java.util.List;
4+
5+
public class BookIterator implements Iterator<Book> {
6+
7+
private List<Book> bookList;
8+
private int position = 0;
9+
10+
public BookIterator(List<Book> bookList) {
11+
this.bookList = bookList;
12+
}
13+
14+
@Override
15+
public Book next() {
16+
return bookList.get(position++);
17+
}
18+
19+
@Override
20+
public boolean hasNext() {
21+
return position < bookList.size();
22+
}
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.heibaiying.behavioral.iterator;
2+
3+
/**
4+
* 书柜
5+
*/
6+
public interface Bookshelf {
7+
8+
void addBook(Book book);
9+
10+
void removeBook(Book book);
11+
12+
BookIterator iterator();
13+
}

0 commit comments

Comments
 (0)