jQ與JS實現tab欄切換案例
阿新 • • 發佈:2020-12-27
技術標籤:設計模式
在軟體開發過程中有時需要建立一個複雜的物件,這個複雜物件通常由多個子部件按一定的步驟組合而成。還是以電子郵件為例,每封電子郵件由發件人、收件人、主題、內容、附件等內容構成。
生活中這樣的例子很多,如遊戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、髮型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;
以上所有這些產品都是由多個部件構成的,各個部件可以靈活選擇,但其建立步驟都大同小異。這類產品的建立無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產品的建立。
模式的定義與特點
建造者(Builder)模式的定義:指將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示。它是將一個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
- 封裝性好,構建和表示分離。
- 擴充套件性好,各個具體的建造者相互獨立,有利於系統的解耦。
- 客戶端不必知道產品內部組成的細節,建造者可以對建立過程逐步細化,而不對其它模組產生任何影響,便於控制細節風險。
缺點如下:
- 產品的組成部分必須相同,這限制了其使用範圍。
- 如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。
類圖:
四個要素
- 產品類:一般是一個較為複雜的物件,也就是說建立物件的過程比較複雜,一般會有比較多的程式碼量。在本類圖中,產品類是一個具體的類,而非抽象類。實際程式設計中,產品類可以是由一個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。
- 抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品。
- 建造者:實現抽象類的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品。
- 導演類(指揮類):負責呼叫適當的建造者來組建產品,導演類一般不與產品類發生依賴關係,與導演類直接互動的是建造者類。一般來說,導演類被用來封裝程式中易變的部分。
舉個簡單例子(郵件的建立造過程,包括髮件人、收件人、主題、內容、附件):
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());
}
}