¸ÅÊö
ÔÚÈí¼þ¿ª·¢ÏµÍ³ÖУ¬¿Í»§³ÌÐò¾³£»áÓ븴ÔÓϵͳµÄÄÚ²¿×Óϵͳ֮¼ä²úÉúñîºÏ£¬¶øµ¼Ö¿ͻ§³ÌÐòËæ×Å×ÓϵͳµÄ±ä»¯¶ø±ä»¯¡£ÄÇôÈçºÎ¼ò»¯¿Í»§³ÌÐòÓë×Óϵͳ֮¼äµÄ½»»¥½Ó¿Ú£¿ÈçºÎ½«¸´ÔÓϵͳµÄÄÚ²¿×ÓϵͳÓë¿Í»§³ÌÐòÖ®¼äµÄÒÀÀµ½âñÕâ¾ÍÊÇҪ˵µÄFa?ade
ģʽ¡£
Òâͼ
Ϊ×ÓϵͳÖеÄÒ»×é½Ó¿ÚÌṩһ¸öÒ»ÖµĽçÃæ£¬Facadeģʽ¶¨ÒåÁËÒ»¸ö¸ß²ã½Ó¿Ú£¬Õâ¸ö½Ó¿ÚʹµÃÕâÒ»×Óϵͳ¸ü¼ÓÈÝÒ×ʹÓá£[GOF
¡¶Éè¼ÆÄ£Ê½¡·]
ʾÒâͼ
ÃÅÃæÄ£Ê½Ã»ÓÐÒ»¸öÒ»°ã»¯µÄÀàͼÃèÊö£¬ÏÂÃæÊÇÒ»¸öʾÒâÐԵĶÔÏóͼ£º

ͼ1 Fa?adeģʽʾÒâÐÔ¶ÔÏóͼ
Éú»îÖеÄÀý×Ó
Íâ¹ÛģʽΪ×ÓϵͳÖеĽӿڶ¨ÒåÁËÒ»¸öͳһµÄ¸ü¸ß²ã´ÎµÄ½çÃæ£¬ÒÔ±ãÓÚʹÓᣵ±Ïû·ÑÕß°´ÕÕĿ¼²É¹ºÊ±£¬ÔòÌåÏÖÁËÒ»¸öÍâ¹Ûģʽ¡£Ïû·ÑÕß²¦´òÒ»¸öºÅÂëÓë¿Í·þ´ú±íÁªÏµ£¬¿Í·þ´ú±íÔò°çÑÝÁËÕâ¸ö"Íâ¹Û"£¬Ëû°üº¬ÁËÓë¶©»õ²¿¡¢ÊÕÒø²¿ºÍËÍ»õ²¿µÄ½Ó¿Ú¡£

ͼ2ʹÓõ绰¶©»õÀý×ÓµÄÍâ¹Ûģʽ¶ÔÏóͼ
Facadeģʽ½â˵
ÎÒÃÇÆ½Ê±µÄ¿ª·¢ÖÐÆäʵÒѾ²»Öª²»¾õµÄÔÚÓÃFa?adeģʽ£¬ÏÖÔÚÀ´¿¼ÂÇÕâÑùÒ»¸öµÖѺϵͳ£¬µ±ÓÐÒ»¸ö¿Í»§À´Ê±£¬ÓÐÈçϼ¸¼þÊÂÇéÐèҪȷÈÏ£ºµ½ÒøÐÐ×Óϵͳ²éѯËûÊÇ·ñÓÐ×ã¹»¶àµÄ´æ¿î£¬µ½ÐÅÓÃ×Óϵͳ²éѯËûÊÇ·ñÓÐÁ¼ºÃµÄÐÅÓ㬵½´û¿î×Óϵͳ²éѯËûÓÐÎÞ´û¿îÁÓ¼£¡£Ö»ÓÐÕâÈý¸ö×Óϵͳ¶¼Í¨¹ýʱ²Å¿É½øÐеÖѺ¡£ÎÒÃÇÏȲ»¿¼ÂÇFa?adeģʽ£¬ÄÇô¿Í»§³ÌÐò¾ÍÒªÖ±½Ó·ÃÎÊÕâЩ×Óϵͳ£¬·Ö±ð½øÐÐÅжϡ£Àà½á¹¹Í¼Ï£º

ͼ3
ÔÚÕâ¸ö³ÌÐòÖУ¬ÎÒÃÇÊ×ÏÈÒªÓÐÒ»¸ö¹Ë¿ÍÀ࣬ËüÊÇÒ»¸ö´¿Êý¾ÝÀ࣬²¢ÎÞÈκβÙ×÷£¬Ê¾Òâ´úÂ룺
public class Customer { private string _name;
public Customer(string name)
{
this._name = name;
}
public string Name
{
get { return _name; }
}
} |
ÏÂÃæÕâÈý¸öÀà¾ùÊÇ×ÓϵͳÀ࣬ʾÒâ´úÂ룺
public class Bank { public bool HasSufficientSavings(Customer c, int amount) { Console.WriteLine("Check bank for " + c.Name); return true; } }
//ÐÅÓÃ×Óϵͳ
public class Credit
{
public bool HasGoodCredit(Customer c)
{
Console.WriteLine("Check credit for "
+ c.Name);
return true;
}
}
//´û¿î×Óϵͳ
public class Loan
{
public bool HasNoBadLoans(Customer c)
{
Console.WriteLine("Check loans for "
+ c.Name);
return true;
}
} |
À´¿´¿Í»§³ÌÐòµÄµ÷Óãº
public class MainApp { private const int _amount = 12000;
public static void Main()
{
Bank bank = new Bank();
Loan loan = new Loan();
Credit credit = new Credit();
Customer customer = new Customer("Ann McKinsey");
bool eligible = true;
if (!bank.HasSufficientSavings(customer, _amount))
{
eligible = false;
}
else if (!loan.HasNoBadLoans(customer))
{
eligible = false;
}
else if (!credit.HasGoodCredit(customer))
{
eligible = false;
}
Console.WriteLine("\n" + customer.Name
+ " has been " + (eligible ? "Approved"
: "Rejected"));
Console.ReadLine();
}
} |
¿ÉÒÔ¿´µ½£¬ÔÚ²»ÓÃFa?adeģʽµÄÇé¿öÏ£¬¿Í»§³ÌÐòÓëÈý¸ö×Óϵͳ¶¼·¢ÉúÁËñîºÏ£¬ÕâÖÖñîºÏʹµÃ¿Í»§³ÌÐòÒÀÀµÓÚ×Óϵͳ£¬µ±×Óϵͳ±ä»¯Ê±£¬¿Í»§³ÌÐòÒ²½«ÃæÁٺܶà±ä»¯µÄÌôÕ½¡£Ò»¸öºÏÇéºÏÀíµÄÉè¼Æ¾ÍÊÇΪÕâЩ×Óϵͳ´´½¨Ò»¸öͳһµÄ½Ó¿Ú£¬Õâ¸ö½Ó¿Ú¼ò»¯Á˿ͻ§³ÌÐòµÄÅжϲÙ×÷¡£¿´Ò»ÏÂÒýÈëFa?adeģʽºóµÄÀà½á¹¹Í¼£º

ͼ4
ÃÅÃæÀàMortageµÄʵÏÖÈçÏ£º
public class Mortgage { private Bank bank = new Bank(); private Loan loan = new Loan(); private Credit credit = new Credit();
public bool IsEligible(Customer cust, int amount)
{
Console.WriteLine("{0} applies for {1:C}
loan\n",
cust.Name, amount);
bool eligible = true;
if (!bank.HasSufficientSavings(cust, amount))
{
eligible = false;
}
else if (!loan.HasNoBadLoans(cust))
{
eligible = false;
}
else if (!credit.HasGoodCredit(cust))
{
eligible = false;
}
return eligible;
}
} |
¹Ë¿ÍÀàºÍ×ÓϵͳÀàµÄʵÏÖÈÔÈ»ÈçÏ£º
public class Bank { public bool HasSufficientSavings(Customer c, int amount) { Console.WriteLine("Check bank for " + c.Name); return true; } }
//ÐÅÓÃÖ¤×Óϵͳ
public class Credit
{
public bool HasGoodCredit(Customer c)
{
Console.WriteLine("Check credit for "
+ c.Name);
return true;
}
}
//´û¿î×Óϵͳ
public class Loan
{
public bool HasNoBadLoans(Customer c)
{
Console.WriteLine("Check loans for "
+ c.Name);
return true;
}
}
//¹Ë¿ÍÀà
public class Customer
{
private string name;
public Customer(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
} |
¶ø´Ëʱ¿Í»§³ÌÐòµÄʵÏÖ£º
public class MainApp { public static void Main() { //Íâ¹Û Mortgage mortgage = new Mortgage();
Customer customer = new Customer("Ann McKinsey");
bool eligable = mortgage.IsEligible(customer,
125000);
Console.WriteLine("\n" + customer.Name
+
" has been " + (eligable ? "Approved"
: "Rejected"));
Console.ReadLine();
}
} |
¿ÉÒÔ¿´µ½ÒýÈëFa?adeģʽºó£¬¿Í»§³ÌÐòÖ»ÓëMortgage·¢ÉúÒÀÀµ£¬Ò²¾ÍÊÇMortgageÆÁ±ÎÁË×Óϵͳ֮¼äµÄ¸´ÔӵIJÙ×÷£¬´ïµ½Á˽âñîÄÚ²¿×ÓϵͳÓë¿Í»§³ÌÐòÖ®¼äµÄÒÀÀµ¡£
.NET¼Ü¹¹ÖеÄFa?adeģʽ
Fa?adeģʽÔÚʵ¼Ê¿ª·¢ÖÐ×î¶àµÄÔËÓõ±Êô¿ª·¢N²ã¼Ü¹¹µÄÓ¦ÓóÌÐòÁË£¬Ò»¸öµäÐ͵ÄN²ã½á¹¹ÈçÏ£º

ͼ5
ÔÚÕâ¸ö¼Ü¹¹ÖУ¬×ܹ²·ÖΪËĸöÂß¼²ã£¬·Ö±ðΪ£ºÓû§²ãUI£¬ÒµÎñÍâ¹Û²ãBusiness Fa?ade£¬ÒµÎñ¹æÔò²ãBusiness
Rule£¬Êý¾Ý·ÃÎʲãData Access¡£ÆäÖÐBusiness Fa?ade²ãµÄÖ°ÔðÈçÏ£º
1.´Ó¡°Óû§¡±²ã½ÓÊÕÓû§ÊäÈë
2.Èç¹ûÇëÇóÐèÒª¶ÔÊý¾Ý½øÐÐÖ»¶Á·ÃÎÊ£¬Ôò¿ÉÄÜʹÓá°Êý¾Ý·ÃÎÊ¡±²ã
3. ½«ÇëÇ󴫵ݵ½¡°ÒµÎñ¹æÔò¡±²ã
4. ½«ÏìÓ¦´Ó¡°ÒµÎñ¹æÔò¡±²ã·µ»Øµ½¡°Óû§¡±²ã
5. ÔÚ¶Ô¡°ÒµÎñ¹æÔò¡±²ãµÄµ÷ÓÃÖ®¼äά»¤ÁÙʱ״̬
¶ÔÕâÒ»¼Ü¹¹×îºÃµÄÌåÏÖ¾ÍÊÇDuwamishʾÀýÁË¡£ÔÚ¸ÃÓ¦ÓóÌÐòÖУ¬Óв¿·Ö²Ù×÷Ö»ÊǼòµ¥µÄ´ÓÊý¾Ý¿â¸ù¾ÝÌõ¼þÌáÈ¡Êý¾Ý£¬²»ÐèÒª¾¹ýÈκδ¦Àí£¬¶øÖ±½Ó½«Êý¾ÝÏÔʾµ½ÍøÒ³ÉÏ£¬±ÈÈç²éѯijÀà±ðµÄͼÊéÁÐ±í¡£¶øÁíÍâһЩ²Ù×÷£¬±ÈÈç¼ÆË㶨µ¥ÖÐͼÊéµÄ×ܼ۲¢¸ù¾Ý¹Ë¿ÍµÄ¼¶±ð¼ÆËã»Ø¿ÛµÈµÈ£¬Õⲿ·ÖÍùÍùÓÐÐí¶à²»Í¬µÄ¹¦ÄܵÄÀ࣬²Ù×÷ÆðÀ´Ò²±È½Ï¸´ÔÓ¡£Èç¹û²ÉÓô«Í³µÄÈý²ã½á¹¹£¬ÕâЩÉÌÒµÂß¼Ò»°ãÊÇ»á·ÅÔÚÖмä²ã£¬ÄÇô¶ÔÄÚ²¿µÄÕâЩ´óÁ¿ÖÖÀà·±¶à£¬Ê¹Ó÷½·¨Ò²¸÷ÒìµÄ²»Í¬µÄÀàµÄµ÷ÓÃÈÎÎñ£¬¾ÍÍêÈ«Âäµ½Á˱íʾ²ã¡£ÕâÑùÊÆ±Ø»áÔö¼Ó±íʾ²ãµÄ´úÂëÁ¿£¬½«±íʾ²ãµÄÈÎÎñ¸´ÔÓ»¯£¬ºÍ±íʾ²ãÖ»¸ºÔð½ÓÊÜÓû§µÄÊäÈë²¢·µ»Ø½á¹ûµÄÈÎÎñ²»Ì«Ïà³Æ£¬²¢Ôö¼ÓÁ˲ãÓë²ãÖ®¼äµÄñîºÏ³Ì¶È¡£ÓÚÊǾÍÒýÈëÁËÒ»¸öFa?ade²ã£¬ÈÃÕâ¸öFacadeÀ´¸ºÔð¹ÜÀíϵͳÄÚ²¿ÀàµÄµ÷Ó㬲¢Îª±íʾ²ãÌṩÁËÒ»¸öµ¥Ò»¶ø¼òµ¥µÄ½Ó¿Ú¡£¿´Ò»ÏÂDuwamish½á¹¹Í¼£º

ͼ6
´ÓͼÖпÉÒÔ¿´µ½£¬UI²ã½«ÇëÇó·¢Ë͸øÒµÎñÍâ¹Û²ã£¬ÒµÎñÍâ¹Û²ã¶ÔÇëÇó½øÐгõ²½µÄ´¦Àí£¬ÅжÏÊÇ·ñÐèÒªµ÷ÓÃÒµÎñ¹æÔò²ã£¬»¹ÊÇÖ±½Óµ÷ÓÃÊý¾Ý·ÃÎʲã»ñÈ¡Êý¾Ý¡£×îºóÓÉÊý¾Ý·ÃÎʲã·ÃÎÊÊý¾Ý¿â²¢°´ÕÕÀ´Ê±µÄ²½Öè·µ»Ø½á¹ûµ½UI²ã£¬À´¿´¾ßÌåµÄ´úÂëʵÏÖ¡£
ÔÚ»ñÈ¡ÉÌÆ·Ä¿Â¼µÄʱºò£¬Web UIµ÷ÓÃÒµÎñÍâ¹Û²ã£º
productSystem = new ProductSystem(); categorySet = productSystem.GetCategories(categoryID); |
ÒµÎñÍâ¹Û²ãÖ±½Óµ÷ÓÃÁËÊý¾Ý·ÃÎʲ㣺
public CategoryData GetCategories(int categoryId) { // // Check preconditions // ApplicationAssert.CheckCondition(categoryId >= 0,"Invalid Category Id",ApplicationAssert.LineNumber); // // Retrieve the data // using (Categories accessCategories = new Categories()) { return accessCategories.GetCategories(categoryId); } } |
ÔÚÌí¼Ó¶©µ¥Ê±£¬UIµ÷ÓÃÒµÎñÍâ¹Û²ã£º
public void AddOrder() { ApplicationAssert.CheckCondition(cartOrderData != null, "Order requires data", ApplicationAssert.LineNumber);
//Write trace log.
ApplicationLog.WriteTrace("Duwamish7.Web.Cart.AddOrder:\r\nCustomerId:
" +
cartOrderData.Tables[OrderData.CUSTOMER_TABLE].Rows[0][OrderData.PKID_FIELD].ToString());
cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
} |
ÒµÎñÍâ¹Û²ãµ÷ÓÃÒµÎñ¹æÔò²ã£º
public OrderData AddOrder(OrderData order) { // // Check preconditions // ApplicationAssert.CheckCondition(order != null, "Order is required", ApplicationAssert.LineNumber); (new BusinessRules.Order()).InsertOrder(order); return order; } |
ÒµÎñ¹æÔò²ã½øÐи´ÔÓµÄÂß¼´¦Àíºó£¬ÔÙµ÷ÓÃÊý¾Ý·ÃÎʲ㣺
public bool InsertOrder(OrderData order) { // // Assume it's good // bool isValid = true; // // Validate order summary // DataRow summaryRow = order.Tables[OrderData.ORDER_SUMMARY_TABLE].Rows[0]; summaryRow.ClearErrors();
if (CalculateShipping(order) != (Decimal)(summaryRow[OrderData.SHIPPING_HANDLING_FIELD]))
{
summaryRow.SetColumnError(OrderData.SHIPPING_HANDLING_FIELD,
OrderData.INVALID_FIELD);
isValid = false;
}
if (CalculateTax(order) != (Decimal)(summaryRow[OrderData.TAX_FIELD]))
{
summaryRow.SetColumnError(OrderData.TAX_FIELD,
OrderData.INVALID_FIELD);
isValid = false;
}
//
// Validate shipping info
//
isValid &= IsValidField(order, OrderData.SHIPPING_ADDRESS_TABLE,
OrderData.SHIP_TO_NAME_FIELD, 40);
//
// Validate payment info
//
DataRow paymentRow = order.Tables[OrderData.PAYMENT_TABLE].Rows[0];
paymentRow.ClearErrors();
isValid &= IsValidField(paymentRow, OrderData.CREDIT_CARD_TYPE_FIELD,
40);
isValid &= IsValidField(paymentRow, OrderData.CREDIT_CARD_NUMBER_FIELD,
32);
isValid &= IsValidField(paymentRow, OrderData.EXPIRATION_DATE_FIELD,
30);
isValid &= IsValidField(paymentRow, OrderData.NAME_ON_CARD_FIELD,
40);
isValid &= IsValidField(paymentRow, OrderData.BILLING_ADDRESS_FIELD,
255);
//
// Validate the order items and recalculate the
subtotal
//
DataRowCollection itemRows = order.Tables[OrderData.ORDER_ITEMS_TABLE].Rows;
Decimal subTotal = 0;
foreach (DataRow itemRow in itemRows)
{
itemRow.ClearErrors();
subTotal += (Decimal)(itemRow[OrderData.EXTENDED_FIELD]);
if ((Decimal)(itemRow[OrderData.PRICE_FIELD])
<= 0)
{
itemRow.SetColumnError(OrderData.PRICE_FIELD,
OrderData.INVALID_FIELD);
isValid = false;
}
if ((short)(itemRow[OrderData.QUANTITY_FIELD])
<= 0)
{
itemRow.SetColumnError(OrderData.QUANTITY_FIELD,
OrderData.INVALID_FIELD);
isValid = false;
}
}
//
// Verify the subtotal
//
if (subTotal != (Decimal)(summaryRow[OrderData.SUB_TOTAL_FIELD]))
{
summaryRow.SetColumnError(OrderData.SUB_TOTAL_FIELD,
OrderData.INVALID_FIELD);
isValid = false;
}
if ( isValid )
{
using (DataAccess.Orders ordersDataAccess = new
DataAccess.Orders())
{
return (ordersDataAccess.InsertOrderDetail(order))
> 0;
}
}
else
return false;
} |
Ч¹û¼°ÊµÏÖÒªµã
1£®Fa?adeģʽ¶Ô¿Í»§ÆÁ±ÎÁË×Óϵͳ×é¼þ£¬Òò¶ø¼õÉÙÁ˿ͻ§´¦ÀíµÄ¶ÔÏóµÄÊýÄ¿²¢Ê¹µÃ×ÓϵͳʹÓÃÆðÀ´¸ü¼Ó·½±ã¡£
2£®Fa?adeģʽʵÏÖÁË×ÓϵͳÓë¿Í»§Ö®¼äµÄËÉñîºÏ¹ØÏµ£¬¶ø×ÓϵͳÄÚ²¿µÄ¹¦ÄÜ×é¼þÍùÍùÊǽôñîºÏµÄ¡£ËÉñîºÏ¹ØÏµÊ¹µÃ×ÓϵͳµÄ×é¼þ±ä»¯²»»áÓ°Ïìµ½ËüµÄ¿Í»§¡£
3£®Èç¹ûÓ¦ÓÃÐèÒª£¬Ëü²¢²»ÏÞÖÆËüÃÇʹÓÃ×ÓϵͳÀà¡£Òò´ËÄã¿ÉÒÔÔÚϵͳÒ×ÓÃÐÔÓëͨÓÃÐÔÖ®¼äÑ¡Ôñ¡£
ÊÊÓÃÐÔ
1£®ÎªÒ»¸ö¸´ÔÓ×ÓϵͳÌṩһ¸ö¼òµ¥½Ó¿Ú¡£
2£®Ìá¸ß×ÓϵͳµÄ¶ÀÁ¢ÐÔ¡£
3£®ÔÚ²ã´Î»¯½á¹¹ÖУ¬¿ÉÒÔʹÓÃFacadeģʽ¶¨ÒåϵͳÖÐÿһ²ãµÄÈë¿Ú¡£
×ܽá
Fa?adeÄ£Ê½×¢ÖØµÄÊǼò»¯½Ó¿Ú£¬Ëü¸ü¶àµÄʱºòÊǴӼܹ¹µÄ²ã´ÎÈ¥¿´Õû¸öϵͳ£¬¶ø²¢·Çµ¥¸öÀàµÄ²ã´Î¡£
|