大话设计模式第四章外观模式总结
2017-04-27 15:28
417 查看
四、外观模式
1.外观模式意图
外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面。通过这个界面,其他系统可以方便的调用子系统中的功能,而忽略子系统内部发生的变化。
2.何时使用外观模式
(1)在设计初期阶段,应该要有意识地将不同的两个层分离。
例如:数据访问层和业务逻辑层、业务逻辑层和表示层,层与层之间建立外观Facade
(2)在开发阶段,子系统往往因为不断地重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
(3)在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
3.应用外观模式的注意事项
(1)在设计外观时,不需要增加额外的功能
(2)不要从外观方法中返回子系统中的组件给客户
(3)应用外观的目的是提供一个高层次的接口
因此,外观方法最适合提供特定的高层次的业务服务,而不是进行底层次的单独的业务执行
例子:
建立一个应用:
1.接受客户的详细资料(账户、地址和信用卡信息)应该有三个类:Account Address CreditCard
2.验证输入的信息
3.保存输入的信息到相应的文件中
定义一个外观类CustomerFacade 让它为客户处理(ccount Address CreditCard)所组成的子系统提供一个高层次、简单的接口
Account类:
Address类:
CreditCard 类
需要在创建一个用户类AccountManager,这里省去
现在的交互如图:
接下来定义一个外观类CustomerFacade 让它为客户处理(ccount Address CreditCard)所组成的子系统提供一个高层次、简单的接口。
CustomerFacade 类:
有了CustomerFacade ,降低了客户和子系统(ccount Address CreditCard)之间耦合度。
客户和信息之间的交互:
1.外观模式意图
外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面。通过这个界面,其他系统可以方便的调用子系统中的功能,而忽略子系统内部发生的变化。
2.何时使用外观模式
(1)在设计初期阶段,应该要有意识地将不同的两个层分离。
例如:数据访问层和业务逻辑层、业务逻辑层和表示层,层与层之间建立外观Facade
(2)在开发阶段,子系统往往因为不断地重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
(3)在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
3.应用外观模式的注意事项
(1)在设计外观时,不需要增加额外的功能
(2)不要从外观方法中返回子系统中的组件给客户
(3)应用外观的目的是提供一个高层次的接口
因此,外观方法最适合提供特定的高层次的业务服务,而不是进行底层次的单独的业务执行
例子:
建立一个应用:
1.接受客户的详细资料(账户、地址和信用卡信息)应该有三个类:Account Address CreditCard
2.验证输入的信息
3.保存输入的信息到相应的文件中
定义一个外观类CustomerFacade 让它为客户处理(ccount Address CreditCard)所组成的子系统提供一个高层次、简单的接口
Account类:
public class Account { String firstName; String lastName; final String ACCOUNT_DATA_FILE = "AccountData.txt"; public Account(String firstName, String lastName) { super(); this.firstName = firstName; this.lastName = lastName; } public boolean isValid(){ return true; } /** * 验证时候保存 * @return */ public boolean save(){ FileUtil futil = new FileUtil(); String dataLine = getLastName() + "," +getFirstName(); return futil.writeToFile(ACCOUNT_DATA_FILE,dataLine,true,true); } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Address类:
public class Address { String address; String city; String state; final String ADDRESS_DATA_FILE = "Address.text"; public Address(String address, String city, String state) { super(); this.address = address; this.city = city; this.state = state; } public boolean isValid(){ if(getState().trim().length()<2){ return false; }else{ return true; } } public boolean save(){ FileUtil futil = new FileUtil(); String dataLine = getAddress() + "," +getCity() +"," +getState(); return futil.writeToFile(ADDRESS_DATA_FILE,dataLine,true,true); } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } }
CreditCard 类
public class CreditCard { String cardType; String cardNumber; String cardExpDate; final String CC_DATA_FILE = "Card.txt"; public CreditCard(String cardType, String cardNumber, String cardExpDate) { super(); this.cardType = cardType; this.cardNumber = cardNumber; this.cardExpDate = cardExpDate; } public boolean isValid(){ if(getCardType().equals("AccountManager.VISA")){ return (getCardNumber().trim().length() == 16); } if(getCardType().equals("AccountManager.DISCOVER")){ return (getCardNumber().trim().length() == 15); } if(getCardType().equals("AccountManager.MUSTER")){ return (getCardNumber().trim().length() == 16); } return false; } public boolean save(){ FileUtil futil = new FileUtil(); String dataLine = getCardType() + "," +getCardNumber() +"," +getCardExpDate() ; return futil.writeToFile(CC_DATA_FILE,dataLine,true,true); } public String getCardType() { return cardType; } public void setCardType(String cardType) { this.cardType = cardType; } public String getCardNumber() { return cardNumber; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } public String getCardExpDate() { return cardExpDate; } public void setCardExpDate(String cardExpDate) { this.cardExpDate = cardExpDate; } }
需要在创建一个用户类AccountManager,这里省去
现在的交互如图:
接下来定义一个外观类CustomerFacade 让它为客户处理(ccount Address CreditCard)所组成的子系统提供一个高层次、简单的接口。
CustomerFacade 类:
public class CustomerFacade { public String address; public String city; public String state; public String cardType; public String cardNumber; public String cardExpDate; public String fname; public String lname; public void setAddress(String address) { this.address = address; } public void setCity(String city) { this.city = city; } public void setState(String state) { this.state = state; } public void setCardType(String cardType) { this.cardType = cardType; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } public void setCardExpDate(String cardExpDate) { this.cardExpDate = cardExpDate; } public void setFname(String fname) { this.fname = fname; } public void setLname(String lname) { this.lname = lname; } public boolean saveCustomerData(){ Address objAddress; Account objAccount; CreditCard objCreditCard; boolean validData = true; String errorMessage = ""; objAccount = new Account (fname,lname); if(objAccount.isValid() == false){ validData = false; } errorMessage = "Invalid FirstName/LastName"; objAddress = new Address(address, city, state); if(objAddress.isValid() ==false){ validData = false; errorMessage = "Invalid Address/City/State"; } objCreditCard = new CreditCard(cardType, cardNumber, cardExpDate); if(objCreditCard.isValid() ==false){ validData = false; errorMessage = "Invalid CreditCard Info"; } if(!validData){ System.out.println(errorMessage); return false; } if(objAccount.save() && objAddress.save() && objCreditCard.save()){ return true; }else{ return false; } } }
有了CustomerFacade ,降低了客户和子系统(ccount Address CreditCard)之间耦合度。
客户和信息之间的交互:
相关文章推荐
- 大话设计模式-外观模式学习总结
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(三)
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)
- 大话设计模式-总结(2)-结构型设计模式
- 读《大话设计模式》---外观模式(Facade)
- 大话设计模式5 模版模式 外观模式
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(一)
- 大话设计模式之外观模式
- 设计模式学习总结-外观模式(Facade Pattern)
- 大话设计模式之外观模式
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(六)
- 学习总结-设计模式理解(1) 参考《大话设计模式》《Delphi模式编程》
- 2009-05-03读书记录:《大话设计模式》第十二章——外观模式
- 大话设计模式-总结(1)-创建型设计模式
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)
- 读《大话设计模式》---外观模式(Facade)
- 大话设计模式学习(九)——外观模式
- 大话设计模式-总结(4)-行为型模式二组
- 大话设计模式之外观模式