5 种创建型模式
7 种结构型模式
11 种行为型模式
//用于两个整数相加
public static int add(int a,int b){
return a + b;
}
//用于两个整数相加
public static int add(int a,int b,int c){
return a + b + c;
}
//用于n个整数相加
public static int add(Integer ... arr) {
int sum = 0;
for (Integer i : arr) {
sum += i;
}
return sum;
}
定义
文法(语法)规则:
文法是用于描述语言的语法结构的形式规则
expression ::= value | plus | minus
plus ::= expression ‘+’ expression
minus ::= expression ‘-’ expression
value ::= integer
注意: 这里的符号“::=”表示“定义为”的意思,竖线 | 表示或,左右的其中一个,引号内为字符本身,引号外为语法
解释器模式包含以下主要角色:
【例】设计实现加减法的软件
类图如下:
代码如下:
public abstract class AbstractExpression {
public abstract int interpret(Context context);
}
public class Variable extends AbstractExpression {
//声明存储变量名的成员变量
private String name;
public Variable(String name) {
this.name = name;
}
public int interpret(Context context) {
//直接返回变量的值
return context.getValue(this);
}
@Override
public String toString() {
return name;
}
}
public class Plus extends AbstractExpression {
//+号左边的表达式
private AbstractExpression left;
//+号右边的表达式
private AbstractExpression right;
public Plus(AbstractExpression left, AbstractExpression right) {
this.left = left;
this.right = right;
}
public int interpret(Context context) {
//将左边表达式的结果和右边表达式的结果进行相加
return left.interpret(context) + right.interpret(context);
}
@Override
public String toString() {
return "(" + left.toString() + " + " + right.toString() + ")";
}
}
public class Minus extends AbstractExpression {
//-号左边的表达式
private AbstractExpression left;
//-号右边的表达式
private AbstractExpression right;
public Minus(AbstractExpression left, AbstractExpression right) {
this.left = left;
this.right = right;
}
public int interpret(Context context) {
//将左边表达式的结果和右边表达式的结果进行相减
return left.interpret(context) - right.interpret(context);
}
@Override
public String toString() {
return "(" + left.toString() + " - " + right.toString() + ")";
}
}
public class Context {
//定义一个map集合,用来存储变量及对应的值
private final Map<Variable,Integer> map = new HashMap<>();
//添加变量的功能
public void assign(Variable var, Integer value) {
map.put(var,value);
}
//根据变量获取对应的值
public int getValue(Variable var) {
return map.get(var);
}
}
public class Client {
public static void main(String[] args) {
//创建环境对象
Context context = new Context();
//创建多个变量对象
Variable a = new Variable("a");
Variable b = new Variable("b");
Variable c = new Variable("c");
Variable d = new Variable("d");
//将变量存储到环境对象中
context.assign(a,1);
context.assign(b,2);
context.assign(c,3);
context.assign(d,4);
//获取抽象语法树
AbstractExpression expression = new Plus(new Minus(new Plus(a, b), c), d);
//解释(计算)
int result = expression.interpret(context);
System.out.println(expression + " = " + result);
}
}
输出结果:
(((a + b) - c) + d) = 4
优点
缺点
循环和递归
调用