完整代碼
interface math {
double result(double x);//計算帶入具體x的返回結果
math set(double x);//不同計算增加的內容
}
public class project7 {
public static void main(String[] args) {
// x 當 x = 3
System.out.println(new Function().result(3));
// x+x 當 x = 4
System.out.println(new Function().addition().result(4));
// (x+x)*3 當 x = 5
System.out.println(new Function().addition().multiplication(3).result(5));
}
}
//函數
class Function {
private math function;
double x;
public double result(double x) {//帶入值計算返回結果
this.x = x;
return function.result(x);
}
//創建函數
public Function() {
this.function = new Subject();
}
//傳參的位常數 不傳參的是自變量
//加法
public Function addition(double x) {
function = new addition(function).set(x);
return this;
}
public Function addition() {
function = new addition(function).Add();
return this;
}
//乘法
public Function multiplication(double x) {
function = new multiplication(function).set(x);
return this;
}
public Function multiplication() {
function = new multiplication(function).Add();
return this;
}
//減法
public Function subtraction (double x) {
function = new subtraction(function).set(x);
return this;
}
public Function subtraction () {
function = new subtraction(function).Add();
return this;
}
//除法
public Function division(double x) {
function = new division(function).set(x);
return this;
}
public Function division() {
function = new division(function).Add();
return this;
}
}
class Subject implements math {
math target,X = null;
double x;
public Subject() { }
public double result(double x) {
return x;
}
public Subject(math target) {
this.target = target;
}
public math set(double x) {
this.x = x;
return this;
}
private double R(double x) {
return X.result(x);
}
//增加新變量
public math Add(){
X = new Subject();
return this;
}
}
class addition extends Subject {
public addition(math target) {
super(target);
}
public double result(double x) {
return target.result(x) + ( X == null ? this.x : X.result(x) );
}
}
class subtraction extends Subject {
public subtraction(math target) {
super(target);
}
public double result(double x) {
return target.result(x) - ( X == null ? this.x : X.result(x) );
}
}
class multiplication extends Subject {
public multiplication(math target) {
super(target);
}
public double result(double x) {
return target.result(x) * ( X == null ? this.x : X.result(x) );
}
}
class division extends Subject {
public division(math target) {
super(target);
}
public double result(double x) {
return target.result(x) / ( X == null ? this.x : X.result(x) );
}
}
解釋
math 抽象組件
Subject 抽象裝飾類 (真實角色)
成員變量target是一定存在的,X是後添加的函數可有可無
具體裝飾類
加減乘除爲具體的裝飾類
X == null ? this.x : X.result(x)
這個意思是判斷有沒有增加自變量,如果add的是自變量就讓參數和X關聯
如果添加的不是自變量add的就是常數,跟參數無關
Function 代理角色
具體函數
有點小毛病就是不能實現類似於
上下都是函數的
需要建立兩個分子代理和分母代理才能間接實現