區域性神經(Composite) (轉)

worldblog發表於2008-01-31
區域性神經(Composite) (轉)[@more@]

 

某些情況.你也許希望當你改變某一個個體.而使得整個的其他與之關聯的個體也能感應到

並作出正確的判斷.這種情況很常見.如同.當你對你的主系統升級的時候.你的整體也

得到相應的提高.(現實中不一定.我只是打個比方).那麼很明顯,你的其它部件也感應到了主系

統的效能的改變.也就是說.主系統傳遞給沒個與之關聯的子系統.我現在升級了.你們會得到更

多的輔助效能的提升.這樣就達成了區域性範圍的成功就帶動了整體的優越性.那麼如何才能達到

這一目的呢?顯然必須提出一種心的解決方案.Composite組合的意思.也就是說把個體組合到整

體,並統一控制.下面的問題是如何聯絡個體之間.最容易理解的方案是數.可以用以遍歷其所有

相關.這樣客戶就只需一個某一個物件.而不必考慮與該物件相關的其它物件.並且當

客戶加入新物件的時候.整體也能明白區域性所發生的問題.

還記得小時候玩的電動機器人嗎?升級馬達,加入新的武器.這樣可以提高機器人的整體效能.

OK我們來模擬該環境下的機器人

//區域性
abstract class  Component{
  protected  string partName;
  protected  int Power;
  public Component(string Name){
  partName=Name;
  }
}

//整體(整體也肯能是某個其它整體的區域性所以必須派生自Component)寫成抽象類是為了方面擴充套件
abstract class  MacroCity : Component{
  protected int Item;
  //用於實際區域性物件
  protected ArrayList MacroTree =new MacroTree();
 
  public MacroCity(string name){
  base(name);
  }

  protected void Add(Component ct){
  MacroTree.Add(ct);
  }

  protected void Remove(Component ct){
  while(Comp cn=Next()){
  if(ct.partName==cn.partName)
  MacroTree.Remove(ct);
  }
  }

  protected Component Next(){
  Item=MacroTree.Count-1;
  if(Item>0)
  return MacroTree(Item);
  else
  return null;
  }

  protected void ChangePow(){
  while(Componet cn=Next(){
  this.Power+=cn.Power;
  }
  }
}

//實現區域性
public class HandPart : Componet{
  public HandPart(){
  base("Hand");
  this.Power=200;
  }
}

public class FeetPart : Componet{
  public FeetPart(){
  base("Feet");
  this.Power=400;
  }
}

public class BodyPart : Componet{
  public BodyPart(){
  base("Body");
  this.Power=800;
  }
}

public class HeadPart : Componet{
  public HeadPart(){
  base("Head");
  this.Power=100;
  }
}

//整體實現
public class myMacro :MacroCity{

}

//客戶裝配
public class Client{
  public static int Main(string[] args){
  myMacro mm=new myMacro("myMacroCity");
  HandPart hap=new HandPart();
  HeadPart hep=new HeadPart();
  FeetPart Fp=new FeetPart();
  BodyPart Bp=new BodyPart();
 
  mm.Add(hap);
  mm.Add(hep);
  mm.Add(Fp);
  mm.Add(Bp);
  mm.ChangePow();
  Console.Writeline("整體效能: " + mm.Power);
 
  //假設手臂遭到Power - 50
  hap.Power-=50;
  Console.Writeline("整體效能: " + mm.Power);
 
  //如果腳部徹底損害
  mm.Remove(Fp);
  Console.Writeline("整體效能: " + mm.Power); 
  }


由此看來只要區域性發生變化馬上就會放映到整體情況.這就是Composite的優點

 


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章