《大话设计模式》

第31章

上一章 封面 下一章

大B:“我给你举个例子来说明吧!”

小A:“嗯。好的。”

大B:“让我们建立一个应用:1、接受客户的详细资料(账户、地址和信用卡信息)2、验证输入的信息3、保存输入的信息到相应的文件中。这个应用有三个类:Account、Address和CreditCard。每一个类都有自己的验证和保存数据的方法。”

Listing1:AccountClass

publicclassAccount{

StringfirstName;

StringlastName;

finalStringACCOUNTDATAFILE=“”;

publicAccount(Stringfname,Stringlname){

firstName=fname;

lastName=lname;

publicbooleanisValid{

/*

Letsgowithsimplervalidation

heretokeeptheexamplesimpler.

*/

publicbooleansave{

FileUtilfutil=newFileUtil;

StringdataLine=getLastName+,+getFirstName;

(ACCOUNTDATAFILE,dataLine,true,true);

publicStringgetFirstName{

returnfirstName;

publicStringgetLastName{

returnlastName;

Listing2:AddressClass

publicclassAddress{

Stringaddress;

Stringcity;

Stringstate;

finalStringADDRESSDATAFILE=“”;

publicAddress(Stringadd,Stringcty,Stringst){

address=add;

city=cty;

state=st;

publicbooleanisValid{

/*

Theaddressvalidationalgorithm

couldbeplexinreal-world

applications.

Letsgowithsimplervalidation

heretokeeptheexamplesimpler.

*/

if(www.youxs.org(2)

returnfalse;

returntrue;

publicbooleansave{

FileUtilfutil=newFileUtil;

StringdataLine=getAddress+,“+getCity+”,+getState;

(ADDRESSDATAFILE,dataLine,true,true);

publicStringgetAddress{

returnaddress;

publicStringgetCity{

returncity;

publicStringgetState{

returnstate;

Listing3:CreditCardClass

publicclassCreditCard{

StringcardType;

StringcardNumber;

StringcardExpDate;

finalStringCCDATAFILE=“www.youxs.org”;

publicCreditCard(StringccType,StringccNumber,

StringccExpDate){

cardType=ccType;

cardNumber=ccNumber;

cardExpDate=ccExpDate;

publicbooleanisValid{

/*

Letsgowithsimplervalidation

heretokeeptheexamplesimpler.

*/

if(www.youxs.org){

return(www.youxs.org……16);

if(www.youxs.org){

return(www.youxs.org……15);

if(www.youxs.org){

return(www.youxs.org……16);

returnfalse;

publicbooleansave{

FileUtilfutil=newFileUtil;

StringdataLine=getCardType+,“+getCardNumber+”,+getCardExpDate;

(CCDATAFILE,dataLine,true,true);

publicStringgetCardType{

returncardType;

publicStringgetCardNumber{

returncardNumber;

publicStringgetCardExpDate{

returncardExpDate;

Listing4:ClientAccountManagerClass

publicclassAccountManagerextendsJFrame{

publicstaticfinal-0*963Stringnewline=“\n”;

publicstaticfinalStringVALIDATESAVE=“Validate&Save”;

publicAccountManager{

super(“FacadePattern-Example”);

cmbCardType=newJComboBox;

//Createbuttons

JButtonvalidateSaveButton=newJButton;

publicStringgetFirstName{

}//EndofclassAccountManager

当客户AccountManage运行的时候,展示的用户接口如下:

图大B:“在这个例子中应用外观模式是一个很好的设计,它可以降低客户和子系统组件(Address、Account和CreditCard)之间的耦合度。应用外观模式,定义一个外观类CustomerFacade(Figure6andListing5)。它为由客户数据处理类(Address、Account和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

publicclassCustomerFacade{

privateStringaddress;

privateStringcity;

privateStringstate;

privateStringcardType;

privateStringcardNumber;

privateStringcardExpDate;

privateStringfname;

privateStringlname;

publicvoidsetAddress(StringinAddress){

address=inAddress;

publicvoidsetCity(StringinCity){

city=inCity;

publicvoidsetState(StringinState){

state=inState;

publicvoidsetFName(StringinFName){

fname=inFName;

publicvoidsetLName(StringinLName){

lname=inLName;

publicvoidsetCardType(StringinCardType){

cardType=inCardType;

publicvoidsetCardNumber(StringinCardNumber){

cardNumber=inCardNumber;

publicvoidsetCardExpDate(StringinCardExpDate){

cardExpDate=inCardExpDate;

publicbooleansaveCustomerData{

AddressobjAddress;

AccountobjAccount;

CreditCardobjCreditCard;

/*

clientistransparentfromthefollowing

setofsubsystemrelatedoperations.

*/

booleanvalidData=true;

StringerrorMessage=;

objAccount=newAccount(fname,lname);

if(……false){

validData=false;

errorMessage=“InvalidFirstName/LastName”;

objAddress=newAddress(address,city,state);

if(……false){

validData=false;

errorMessage=“InvalidAddress/City/State”;

objCreditCard=newCreditCard(cardType,cardNumber,cardExpDate);

if(……false){

validData=false;

errorMessage=“InvalidCreditCardInfo”;

if(!validData){

(errorMessage);

returnfalse;

if(&&){

returntrue;

}else{

returnfalse;

大B:“CustomerFacade类以saveCustomData方法的形式提供了业务层次上的服务。客户AccountManager不是直接和子系统的每一个组件交互,而是使用了由CustomFacade对象提供的验证和保存客户数据的更高层次、更简单的接口。”

B:“在新的设计中,为了验证和保存客户数据,客户需要:1、建立或获得外观对象CustomFacade的一个实例。2、传递数据给CustomFacade实例进行验证和保存。3、调用CustomFacade实例上的saveCustomData方法。CustomFacade处理创建子系统中必要的对象并且调用这些对象上相应的验证、保存客户数据的方法这些细节问题。客户不再需要直接访问任何的子系统中的对象。”

小A:“师兄,应用外观模式有哪些注意事项?”

大B:“应用外观模式要注意以下事项:1、在设计外观时,不需要增加额外的功能。2、不要从外观方法中返回子系统中的组件给客户。例如:有一个下面的方法:CreditCardgetCreditCard会报漏子系统的细节给客户。应用就不能从应用外观模式中取得最大的好处。3、应用外观的目的是提供一个高层次的接口。因此,外观方法最适合提供特定的高层次的业务服务,而不是进行底层次的单独的业务执行。”

小A:“明白。我记住了!”

阅读大话设计模式最新章节 请关注热血小说网(www.oaksh.cn)

上一章 目录 下一章 存书架

其他热门小说

大话设计模式