熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

外觀設計模式組圖(Fa?ade pattern)

2013-11-23 19:50:30  來源: Java高級技術 

  描述
  
  外觀模式(Fa?ade pattern)涉及到子系統的一些類所謂子系統是為提供一系列相關的特征(功能)而緊密關聯的一組類例如一個Account類Address類和CreditCard類相互關聯成為子系統的一部分提供在線客戶的特征
  
  在真實的應用系統中一個子系統可能由很多類組成子系統的客戶為了它們的需要需要和子系統中的一些類進行交互客戶和子系統的類進行直接的交互會導致客戶端對象和子系統(Figure )之間高度耦合任何的類似於對子系統中類的接口的修改會對依賴於它的所有的客戶類造成影響
  
 
  Figure : Client Interaction with Subsystem Classes before Applying the Fa?ade Pattern
  

  外觀模式(Fa?ade pattern)很適用於在上述情況外觀模式(Fa?ade pattern)為子系統提供了一個更高層次更簡單的接口從而降低了子系統的復雜度和依賴這使得子系統更易於使用和管理
  
  外觀是一個能為子系統和客戶提供簡單接口的類當正確的應用外觀客戶不再直接和子系統中的類交互而是與外觀交互外觀承擔與子系統中類交互的責任實際上外觀是子系統與客戶的接口這樣外觀模式降低了子系統和客戶的耦合度(Figure )
  
 
  Figure : Client Interaction with Subsystem Classes after Applying the Fa?ade Pattern
  

  從Figure 中我們可以看到外觀對象隔離了客戶和子系統對象從而降低了耦合度當子系統中的類進行改變時客戶端不會像以前一樣受到影響
  
  盡管客戶使用由外觀提供的簡單接口但是當需要的時候客戶端還是可以視外觀不存在直接訪問子系統中的底層次的接口這種情況下它們之間的依賴/耦合度和原來一樣
  
  例子
  
  讓我們建立一個應用
  
  ()  接受客戶的詳細資料(賬戶地址和信用卡信息)
  
  ()  驗證輸入的信息
  
  ()  保存輸入的信息到相應的文件中
  
  這個應用有三個類AccountAddress和CreditCard每一個類都有自己的驗證和保存數據的方法
  
  Listing : AccountClass
  
  public class Account {
  String firstName;
  String lastName;
  final String ACCOUNT_DATA_FILE = AccountDatatxt;
  public Account(String fname String lname) {
  firstName = fname;
  lastName = lname;
  }
  public boolean isValid() {
  /*
  Lets go with simpler validation
  here to keep the example simpler
  */
  …
  …
  }
  public boolean save() {
  FileUtil futil = new FileUtil();
  String dataLine = getLastName() + + getFirstName();
  return futilwriteToFile(ACCOUNT_DATA_FILE dataLine
  true true);
  }
  public String getFirstName() {
  return firstName;
  }
  public String getLastName() {
  return lastName;
  }
  }
  
  Listing : Address Class
  
  public class Address {
  String address;
  String city;
  String state;
  final String ADDRESS_DATA_FILE = Addresstxt;
  public Address(String add String cty String st) {
  address = add;
  city = cty;
  state = st;
  }
  public boolean isValid() {
  /*
  The address validation algorithm
  could be complex in realworld
  applications
  Lets go with simpler validation
  here to keep the example simpler
  */
  if (getState()trim()length() < )
  return false;
  return true;
  }
  public boolean save() {
  FileUtil futil = new FileUtil();
  String dataLine = getAddress() + + getCity() + +
  getState();
  return futilwriteToFile(ADDRESS_DATA_FILE dataLine
  true true);
  }
  public String getAddress() {
  return address;
  }
  public String getCity() {
  return city;
  }
  public String getState() {
  return state;
  }
  }
  
  Listing : CreditCard Class
  
  public class CreditCard {
  String cardType;
  String cardNumber;
  String cardExpDate;
  final String CC_DATA_FILE = CCtxt;
  public CreditCard(String ccType String ccNumber
  String ccExpDate) {
  cardType = ccType;
  cardNumber = ccNumber;
  cardExpDate = ccExpDate;
  }
  public boolean isValid() {
  /*
  Lets go with simpler validation
  here to keep the example simpler
  */
  if (getCardType()equals(AccountManagerVISA)) {
  return (getCardNumber()trim()length() == );
  }
  if (getCardType()equals(AccountManagerDISCOVER)) {
  return (getCardNumber()trim()length() == );
  }
  if (getCardType()equals(AccountManagerMASTER)) {
  return (getCardNumber()trim()length() == );
  }
  return false;
  }
  public boolean save() {
  FileUtil futil = new FileUtil();
  String dataLine =
  getCardType() + + getCardNumber() + +
  getCardExpDate();
  return futilwriteToFile(CC_DATA_FILE dataLine true
  true);
  }
  public String getCardType() {
  return cardType;
  }
  public String getCardNumber() {
  return cardNumber;
  }
  public String getCardExpDate() {
  return cardExpDate;
  }
  }
  
 

  讓我們建立一個客戶AccountManager它提供用戶輸入數據的用戶界面
  
  Listing : Client AccountManager Class
  
  public class AccountManager extends JFrame {
  public static final String newline = \n;
  public static final String VALIDATE_SAVE = Validate & Save;
  …
  …
  public AccountManager() {
  super( Facade Pattern Example );
  cmbCardType = new JComboBox();
  cmbCardTypeaddItem(AccountManagerVISA);
  cmbCardTypeaddItem(AccountManagerMASTER);
  cmbCardTypeaddItem(AccountManagerDISCOVER);
  …
  …
  //Create buttons
  JButton validateSaveButton =
  new JButton(AccountManagerVALIDATE_SAVE);
  …
  …
  }
  public String getFirstName() {
  return txtFirstNamegetText();
  }
  …
  …
  }//End of class AccountManager
  
  當客戶AccountManage運行的時候展示的用戶接口如下
  
 
  Figure : User Interface to Enter the Customer Data
  

  為了驗證和保存輸入的數據客戶AccountManager需要
  
  ()  建立AccountAddress和CreditCard對象
  
  ()  用這些對象驗證輸入的數據
  
  ()  用這些對象保存輸入的數據
  
  下面是對象間的交互順序圖
  
 
  Figure : How a Client Would Normally Interact (Directly) with Subsystem Classes to Validate and Save the Customer Data
  

  在這個例子中應用外觀模式是一個很好的設計它可以降低客戶和子系統組件(AddressAccount和CreditCard)之間的耦合度應用外觀模式讓我們定義一個外觀類CustomerFacade (Figure and Listing )它為由客戶數據處理類(AddressAccount和CreditCard)所組成的子系統提供一個高層次的簡單的接口
  
  CustomerFacade
  address:String
  city:String
  state:String
  cardType:String
  cardNumber:String
  cardExpDate:String
  fname:String
  lname:String
  setAddress(inAddress:String)
  setCity(inCity:String)
  setState(inState:String)
  setCardType(inCardType:String)
  setCardNumber(inCardNumber:String)
  setCardExpDate(inCardExpDate:String)
  setFName(inFName:String)
  setLName(inLName:String)
  saveCustomerData()
  
 
  Figure : Fa?ade Class to Be Used by the Client in the Revised Design
  

  Listing : CustomerFacade Cl
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27533.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.