小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

20. 合成模式

 黎可圖書館 2013-09-15
一. 定義
Composite(組合模式):將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。它使得客戶對單個對象和復(fù)合對象的使用具有一致性。

二. 角色
抽象構(gòu)件(Component)角色:這是一個抽象角色,它給參加組合的對象規(guī)定一個接口。
樹葉構(gòu)件(Leaf)角色:代表參加組合的樹葉對象。
樹枝構(gòu)件(Composite)對象:代表參加組合的有子對象的對象。

三. 實(shí)現(xiàn)
這里舉個數(shù)學(xué)計算的例子,比如1+1是一個簡單算法,而1*(2+3)就是一個簡單算法加上一個復(fù)雜算法。即1是葉子角色,2+3是樹枝構(gòu)件角色。

Test.java
public class Test {
public static void main(String[] args) {
MultipleOperation m1 = new MultipleOperation("+");
SimpleOperation s1 = new SimpleOperation(12);
SimpleOperation s2 = new SimpleOperation(2);
m1.addOperate(s1);
m1.addOperate(s2);
MultipleOperation m2 = new MultipleOperation("*");
SimpleOperation s3 = new SimpleOperation(3);
m2.addOperate(s3);
m2.addOperate(m1);
System.out.println(m2.calculate());
}
}
這里模擬了(12+2)*3的計算。

Calculate.java
public abstract class Calculate {
protected Calculate next;
public abstract double cal(String oper, double num1, double num2);
}
這里運(yùn)用到了責(zé)任鏈模式,這個是責(zé)任接口。

AddCalculate.java
public class AddCalculate extends Calculate {

@Override
public double cal(String oper, double num1, double num2) {
if(oper.equals("+")){
return num1 + num2;
}else{
return super.next.cal(oper, num1, num2);
}
}

}
加法運(yùn)算,減法和乘除都一樣,這里省略。

CalculateChain
public class CalculateChain {
private List<Calculate> calculates;

public CalculateChain(List<Calculate> calculates) {
super();
this.calculates = calculates;
}
private void sort(){
for(int i=0; i< this.calculates.size(); i++){
if(i == this.calculates.size() -1 ){
return;
}
this.calculates.get(i).next = this.calculates.get(i+1);
}
}
public double calculate(String oper, double num1, double num2){
this.sort();
return this.calculates.get(0).cal(oper, num1, num2);
}

}
負(fù)責(zé)將各個算法穿起來的操作。

Operation.java
public interface Operation {
public void addOperate(Operation operation);
public void removeOperate(Operation operation);
public Iterator<Operation> getChild();
public double calculate();
}
抽象構(gòu)件角色。

SimpleOperation.java
public class SimpleOperation implements Operation {
private double number;
public double getNumber() {
return number;
}

public void setNumber(double number) {
this.number = number;
}

public SimpleOperation(double number) {
super();
this.number = number;
}

@Override
public void addOperate(Operation operation) {
}

@Override
public void removeOperate(Operation operation) {
}

@Override
public Iterator<Operation> getChild() {
return null;
}

@Override
public double calculate() {
return this.number;
}

}
葉子構(gòu)件角色。

MultipleOperation.java
public class MultipleOperation implements Operation {
private Vector<Operation> operations = new Vector<Operation>();
private String oper;
public MultipleOperation(String oper) {
super();
this.oper = oper;
}

@Override
public void addOperate(Operation operation) {
if(this.operations.size() == 2){
this.operations.remove(1);
}
this.operations.add(operation);
}

@Override
public void removeOperate(Operation operation) {
this.operations.remove(operation);
}

@Override
public Iterator<Operation> getChild() {
return this.operations.iterator();
}

@Override
public double calculate() {
double num1 = this.operations.get(0).calculate();
double num2 = this.operations.get(1).calculate();
List<Calculate> cals = new ArrayList<Calculate>();
AddCalculate add = new AddCalculate();
SubtractCalculate sub = new SubtractCalculate();
MultiplyCalculate mul = new MultiplyCalculate();
DivideCalculate divide = new DivideCalculate();
cals.add(add);
cals.add(sub);
cals.add(mul);
cals.add(divide);
return new CalculateChain(cals).calculate(oper, num1, num2);
}

}
樹枝構(gòu)件角色。



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多