1. 程式人生 > 實用技巧 >Windows自定義實現映象打包---使用sysprep封裝,並使用imagex進行備份恢復

Windows自定義實現映象打包---使用sysprep封裝,並使用imagex進行備份恢復

組合模式

  1. 組合模式(Composite Pattern),又叫部分整體模式,它建立了物件組的樹形結構,將物件組合成樹狀結構以表示“整體部分”的層次關係。
  2. 組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。
  3. 這種型別的設計模式屬於結構型模式。
  4. 組合模式使得使用者對單個物件和組合物件的訪問具有一致性,即:組合能讓客戶以一致的方式處理個別對象以及組合物件

  • Component :這是組合中物件宣告介面,在適當情況下,實現所有類共有的介面預設行為,用於訪問和管理
  • Component子部件, Component可以是抽象類或者介面
  • Leaf:在組合中表示葉子節點,葉子節點沒有子節點
  • Composite :非葉子節點,用於儲存子 部件,在 Component介面中實現 子部件的相關操作,比如增加(add),刪除。

應用例項

public class Client {

   public static void main(String[] args) {
      // TODO Auto-generated method stub
      
      //從大到小建立物件 學校
      OrganizationComponent university = new University("清華大學", " 中國頂級大學 ");
      
      //建立 學院
      OrganizationComponent computerCollege = new College("計算機學院", " 計算機學院 ");
      OrganizationComponent infoEngineercollege = new College("資訊工程學院", " 資訊工程學院 ");
      
      
      //建立各個學院下面的系(專業)
      computerCollege.add(new Department("軟體工程", " 軟體工程不錯 "));
      computerCollege.add(new Department("網路工程", " 網路工程不錯 "));
      computerCollege.add(new Department("電腦科學與技術", " 電腦科學與技術是老牌的專業 "));
      
      //
      infoEngineercollege.add(new Department("通訊工程", " 通訊工程不好學 "));
      infoEngineercollege.add(new Department("資訊工程", " 資訊工程好學 "));
      
      //將學院加入到 學校
      university.add(computerCollege);
      university.add(infoEngineercollege);
      
      //university.print();
      infoEngineercollege.print();
   }

}
public class College extends OrganizationComponent {

   //List 中 存放的Department
   List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

   // 構造器
   public College(String name, String des) {
      super(name, des);
      // TODO Auto-generated constructor stub
   }

   // 重寫add
   @Override
   protected void add(OrganizationComponent organizationComponent) {
      // TODO Auto-generated method stub
      //  將來實際業務中,Colleage 的 add 和  University add 不一定完全一樣
      organizationComponents.add(organizationComponent);
   }

   // 重寫remove
   @Override
   protected void remove(OrganizationComponent organizationComponent) {
      // TODO Auto-generated method stub
      organizationComponents.remove(organizationComponent);
   }

   @Override
   public String getName() {
      // TODO Auto-generated method stub
      return super.getName();
   }

   @Override
   public String getDes() {
      // TODO Auto-generated method stub
      return super.getDes();
   }

   // print方法,就是輸出University 包含的學院
   @Override
   protected void print() {
      // TODO Auto-generated method stub
      System.out.println("--------------" + getName() + "--------------");
      //遍歷 organizationComponents 
      for (OrganizationComponent organizationComponent : organizationComponents) {
         organizationComponent.print();
      }
   }


}
public class Department extends OrganizationComponent {

   //沒有集合
   
   public Department(String name, String des) {
      super(name, des);
      // TODO Auto-generated constructor stub
   }

   
   //add , remove 就不用寫了,因為他是葉子節點
   
   @Override
   public String getName() {
      // TODO Auto-generated method stub
      return super.getName();
   }
   
   @Override
   public String getDes() {
      // TODO Auto-generated method stub
      return super.getDes();
   }
   
   @Override
   protected void print() {
      // TODO Auto-generated method stub
      System.out.println(getName());
   }

}
public abstract class OrganizationComponent {

   private String name; // 名字
   private String des; // 說明
   
   protected  void add(OrganizationComponent organizationComponent) {
      //預設實現
      throw new UnsupportedOperationException();
   }
   
   protected  void remove(OrganizationComponent organizationComponent) {
      //預設實現
      throw new UnsupportedOperationException();
   }

   //構造器
   public OrganizationComponent(String name, String des) {
      super();
      this.name = name;
      this.des = des;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getDes() {
      return des;
   }

   public void setDes(String des) {
      this.des = des;
   }
   
   //方法print, 做成抽象的, 子類都需要實現
   protected abstract void print();
   
   
}
/University 就是 Composite , 可以管理College
public class University extends OrganizationComponent {

   List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

   // 構造器
   public University(String name, String des) {
      super(name, des);
      // TODO Auto-generated constructor stub
   }

   // 重寫add
   @Override
   protected void add(OrganizationComponent organizationComponent) {
      // TODO Auto-generated method stub
      organizationComponents.add(organizationComponent);
   }

   // 重寫remove
   @Override
   protected void remove(OrganizationComponent organizationComponent) {
      // TODO Auto-generated method stub
      organizationComponents.remove(organizationComponent);
   }

   @Override
   public String getName() {
      // TODO Auto-generated method stub
      return super.getName();
   }

   @Override
   public String getDes() {
      // TODO Auto-generated method stub
      return super.getDes();
   }

   // print方法,就是輸出University 包含的學院
   @Override
   protected void print() {
      // TODO Auto-generated method stub
      System.out.println("--------------" + getName() + "--------------");
      //遍歷 organizationComponents 
      for (OrganizationComponent organizationComponent : organizationComponents) {
         organizationComponent.print();
      }
   }

}

注意事項和注意細節

  1. 簡化客戶端操作。客戶端只需要面對一致的物件而不用考慮整體部分或者節點葉子的問題。
  2. 具有較強的擴充套件性。當我們要更改組合物件時,我們只需要調整內部的層次關係,客戶端不用做出任何改動.
  3. 方便創建出複雜的層次結構。客戶端不用理會組合裡面的組成細節,容易新增節點或者葉子從而創建出複雜的樹形結構
  4. 需要遍歷組織機構或者處理的物件具有樹形結構時,非常適合使用組合模式.
  5. 要求較高的抽象性,如果節點和葉子有很多差異性的話,比如很多方法和屬性都不一樣,不適合使用組合模式