1. 程式人生 > 其它 >jQ與JS實現tab欄切換案例

jQ與JS實現tab欄切換案例

技術標籤:設計模式

在軟體開發過程中有時需要建立一個複雜的物件,這個複雜物件通常由多個子部件按一定的步驟組合而成。還是以電子郵件為例,每封電子郵件由發件人、收件人、主題、內容、附件等內容構成。

生活中這樣的例子很多,如遊戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、髮型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;
以上所有這些產品都是由多個部件構成的,各個部件可以靈活選擇,但其建立步驟都大同小異。這類產品的建立無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產品的建立。

模式的定義與特點

建造者(Builder)模式的定義:指將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示。它是將一個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。

該模式的主要優點如下:

  1. 封裝性好,構建和表示分離。
  2. 擴充套件性好,各個具體的建造者相互獨立,有利於系統的解耦。
  3. 客戶端不必知道產品內部組成的細節,建造者可以對建立過程逐步細化,而不對其它模組產生任何影響,便於控制細節風險。

缺點如下:

  1. 產品的組成部分必須相同,這限制了其使用範圍。
  2. 如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。

類圖:

這裡寫圖片描述

四個要素

  • 產品類:一般是一個較為複雜的物件,也就是說建立物件的過程比較複雜,一般會有比較多的程式碼量。在本類圖中,產品類是一個具體的類,而非抽象類。實際程式設計中,產品類可以是由一個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。
  • 抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品。
  • 建造者:實現抽象類的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品。
  • 導演類(指揮類):負責呼叫適當的建造者來組建產品,導演類一般不與產品類發生依賴關係,與導演類直接互動的是建造者類。一般來說,導演類被用來封裝程式中易變的部分。

舉個簡單例子(郵件的建立造過程,包括髮件人、收件人、主題、內容、附件):
1 產品類

public class Email{
//實際發件人和收件人等都是一個物件,這裡為了方便用String
private String sender;

private String receiver;

private String topic;

private String content;
// 省略其他屬性及getter和setter方法
}

2 抽象建造者

public interface IEmailBuilder{
public void buildSender();
public void buildReceiver();
public void buildTopic();
public void buildContent();
Email buildEmail();
}

3 具體建造者

public class ConcreteBuilder implements IEmailBuilder{
Email email;

public ConcreteBuilder(){
  email= new Email();
}

@Override
public void buildSender(){
  email.setSender("AA");
}

@Override
public void buildReceiver(){
  email.setReceiver("BB");
}
...
@Override
public Email buildEmail(){
  return this.email;
}
}

4 指導者

public class EmailDirector{
  public EmailconstructEmail(IEmailBuilder builder){
    builder.buildSender();

    builder.buildReceiver();

    builder.buildTopic();
    ...
    return builder.buildEmail();
  }
}

5 測試程式碼

public class MainTest{
  public static void main(String[] args){
     EmailDirector director = new EmailDirector();
     Email email= director.constructCar(new ConcreteBuilder());
     System.out.println(email.getSender());
     System.out.println(email.getReceiver());
     System.out.println(email.getTopic());
  }
}