以一个计算器为例
抽象的计算器接口
public interface Calculator {
double calculate(double a, double b, String op);
}
计算方法抽象类,用于装饰计算器
public abstract class Operate implements Calculator {
Calculator calculator;
public Operate(Calculator calculator) {
this.calculator = calculator;
}
}
普通的加减乘除计算机,实现Calculator接口
public class SimpleCalculator implements Calculator {
@Override
public double calculate(double a, double b, String op) {
if ("+".equals(op)) {
return a + b;
} else if ("-".equals(op)) {
return a - b;
} else if ("*".equals(op)) {
return a * b;
} else if ("/".equals(op)) {
if (b == 0) {
throw new IllegalArgumentException("除数不能为0");
}
return a / b;
} else {
throw new IllegalArgumentException(op + "不合法");
}
}
}
mod计算方法,继承Operate抽象类
public class ModOperate extends Operate {
public ModOperate(Calculator calculator) {
super(calculator);
}
@Override
public double calculate(double a, double b, String op) {
try {
return calculator.calculate(a, b, op);
} catch (IllegalArgumentException e) {
if (op.equals("%")) {
return a % b;
}
throw e;
}
}
}
pow计算方法,同样继承Operate抽象类
public class PowOperate extends Operate {
public PowOperate(Calculator calculator) {
super(calculator);
}
@Override
public double calculate(double a, double b, String op) {
try {
return calculator.calculate(a, b, op);
} catch (IllegalArgumentException e) {
if (op.equals("pow")) {
return Math.pow(a, b);
}
throw e;
}
}
}
测试类
public class Main {
public static void main(String args[]) {
Calculator calculator = new SimpleCalculator();
// 给simpleCalculator修饰一下,实现了更多的计算方法
Operate operate = new PowOperate(calculator);
operate = new ModOperate(operate);
System.out.println(operate.calculate(1, 2, "+"));
System.out.println(operate.calculate(1, 2, "-"));
System.out.println(operate.calculate(1, 2, "*"));
System.out.println(operate.calculate(1, 2, "/"));
// 除数为0
// System.out.println(operate.calculate(1, 0, "/"));
System.out.println(operate.calculate(1, 2, "%"));
System.out.println(operate.calculate(1, 2, "pow"));
System.out.println(operate.calculate(1, 2, "&&&&&"));
}
}
测试结果
3.0
-1.0
2.0
0.5
1.0
1.0
Exception in thread "main" java.lang.IllegalArgumentException: &&&&&不合法
at decorator.SimpleCalculator.calculate(SimpleCalculator.java:19)
at decorator.PowOperate.calculate(PowOperate.java:12)
at decorator.ModOperate.calculate(ModOperate.java:12)
at decorator.Main.main(Main.java:17)