每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
          最近關心的內(nèi)容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks
          Facade用的非常的廣了,以前剛接觸的時候有個誤解,總覺得Facade是簡單的,而它后面的支撐服務是復雜的,對于客戶來說卻是簡單的,現(xiàn)在來看,不完全對,或者說只是說對了一半,因為有時候恰恰是Facade是復雜的.

          我們舉一個例子,比如發(fā)送短信,我們一般就定義一個MessageService的服務類,里面只提供一個方法就行了,sendToUser(String phone,String content)
          但是到了客戶端的時候有了自己的 "方言",比如它不是關心一個抽象的用戶,它只知道向教師發(fā)送短信,或者向?qū)W生發(fā)送短信,或者向家長發(fā)送短信。

          示例如下:

          facade.png
          由圖中可以看到,F(xiàn)acade的內(nèi)容非常豐富,而支撐它的服務類卻很簡單,在開發(fā)過程中我們一般先實現(xiàn)通用的ServiceA,然后根據(jù)進一步的需求做一個面向具體復雜的Facade.



          在Spring提供的sample里發(fā)現(xiàn)一個小技巧,就是Facade和ServiceA都是接口,然后提供一個實現(xiàn)二者的支撐類:


          public?class?PetStoreAnnotationImpl?implements?PetStoreFacade,?OrderService?{

          ????
          private?AccountDao?accountDao;

          ????
          private?CategoryDao?categoryDao;

          ????
          private?ProductDao?productDao;

          ????
          private?ItemDao?itemDao;

          ????
          private?OrderDao?orderDao;


          ????
          //-------------------------------------------------------------------------
          ????
          //?Setter?methods?for?dependency?injection
          ????
          //-------------------------------------------------------------------------

          ????
          public?void?setAccountDao(AccountDao?accountDao)?{
          ????????
          this.accountDao?=?accountDao;
          ????}

          ????
          public?void?setCategoryDao(CategoryDao?categoryDao)?{
          ????????
          this.categoryDao?=?categoryDao;
          ????}

          ????
          public?void?setProductDao(ProductDao?productDao)?{
          ????????
          this.productDao?=?productDao;
          ????}

          ????
          public?void?setItemDao(ItemDao?itemDao)?{
          ????????
          this.itemDao?=?itemDao;
          ????}

          ????
          public?void?setOrderDao(OrderDao?orderDao)?{
          ????????
          this.orderDao?=?orderDao;
          ????}


          ????
          //-------------------------------------------------------------------------
          ????
          //?Operation?methods,?implementing?the?PetStoreFacade?interface
          ????
          //-------------------------------------------------------------------------

          ????
          public?Account?getAccount(String?username)?{
          ????????
          return?this.accountDao.getAccount(username);
          ????}

          ????
          public?Account?getAccount(String?username,?String?password)?{
          ????????
          return?this.accountDao.getAccount(username,?password);
          ????}

          ????
          public?void?insertAccount(Account?account)?{
          ????????
          this.accountDao.insertAccount(account);
          ????}

          ????
          public?void?updateAccount(Account?account)?{
          ????????
          this.accountDao.updateAccount(account);
          ????}

          ????
          public?List?getUsernameList()?{
          ????????
          return?this.accountDao.getUsernameList();
          ????}

          ????
          public?List?getCategoryList()?{
          ????????
          return?this.categoryDao.getCategoryList();
          ????}

          ????
          public?Category?getCategory(String?categoryId)?{
          ????????
          return?this.categoryDao.getCategory(categoryId);
          ????}

          ????
          public?List?getProductListByCategory(String?categoryId)?{
          ????????
          return?this.productDao.getProductListByCategory(categoryId);
          ????}

          ????
          public?List?searchProductList(String?keywords)?{
          ????????
          return?this.productDao.searchProductList(keywords);
          ????}

          ????
          public?Product?getProduct(String?productId)?{
          ????????
          return?this.productDao.getProduct(productId);
          ????}

          ????
          public?List?getItemListByProduct(String?productId)?{
          ????????
          return?this.itemDao.getItemListByProduct(productId);
          ????}

          ????
          public?Item?getItem(String?itemId)?{
          ????????
          return?this.itemDao.getItem(itemId);
          ????}

          ????
          public?boolean?isItemInStock(String?itemId)?{
          ????????
          return?this.itemDao.isItemInStock(itemId);
          ????}

          ????
          public?void?insertOrder(Order?order)?{
          ????????
          this.orderDao.insertOrder(order);
          ????????
          this.itemDao.updateQuantity(order);
          ????}

          ????
          public?Order?getOrder(int?orderId)?{
          ????????
          return?this.orderDao.getOrder(orderId);
          ????}

          ????
          public?List?getOrdersByUsername(String?username)?{
          ????????
          return?this.orderDao.getOrdersByUsername(username);
          ????}

          }


          看起來似乎不錯,不過仔細想想個人認為還是不是太好,總的感覺就是層次不清晰,因為很多時候Facade和Service之間是被服務與服務的關系,所以理當分開。 同時,這個類有點傾向于"萬能類"了,能分還是分開好.這和我們以前提到的dao又背離過來了(以前我們提倡一個業(yè)務一個dao,現(xiàn)在覺得只用一個通用的dao更合適),這個并不矛盾,具體問題具體看待.

          歡迎各位拍磚.
          posted on 2006-10-09 22:27 Alex 閱讀(1380) 評論(2)  編輯  收藏 所屬分類: design

          評論

          # re: 關于Facade的應用 2006-10-11 10:15 123bingbing
          找資料,接項目,MyLinux軟件加工廠為你解決一切難題。  回復  更多評論
            

          # re: 關于Facade的應用 2006-10-14 22:51 山風小子
          “具體問題具體看待”,您說的很有道理!  回復  更多評論
            

          主站蜘蛛池模板: 新和县| 东兰县| 福海县| 绿春县| 宁陕县| 定日县| 修武县| 宁夏| 屏山县| 石楼县| 喀喇沁旗| 福泉市| 东乡| 盱眙县| 上犹县| 阳新县| 嘉祥县| 平武县| 胶南市| 青田县| 闻喜县| 密云县| 左贡县| 周宁县| 张家口市| 中西区| 禄丰县| 泾阳县| 莱阳市| 镇巴县| 万年县| 永善县| 济阳县| 乡城县| 右玉县| 梨树县| 上饶市| 远安县| 宜阳县| 临朐县| 招远市|