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

Java模

2013-11-23 19:42:01  來源: Java高級技術 

  對象的樹結構
  在面向對象的技術裡對象的樹結構是一個強有力的工具更是模式理論的一個重要的組成部分需要應用到符合模式裝飾模式和迭代子模式
  《墨子天志》說庶人竭力從事未得次己而為政有士政之士竭力從事未得次己而為政有將軍大夫政之將軍大夫竭力從事未得次己而為政有三公諸侯政之三公諸侯竭力聽治未得次己而為政有天子政之天子未得次己而為政有天政之
  意為恣意上面的話就是說百姓有官吏管治官吏由將軍和士大夫管治將軍和士大夫由三公和諸侯管治三公和諸侯由天子管治天子由天管治
   
  圖墨子論責任和責任鏈的傳播圖中有陰影的對象給出了一個可能的責任鏈選擇
  當一個百姓提出要求時此要求會傳達到一級再到大夫一級進而傳到諸侯一級天子一級最後到一級
  DHTML中的事件處理
  浏覽器的DOM(Document Object Model)模型中的事件處理均采用責任鏈模式本節首先考察Netscape浏覽器的DHTML的事件處理然後再研究Internet Explorer的事件模型
  Netscape的事件模型
  Netscape的事件處理機制叫做事件捕捉(Event Capturing)在事件捕捉機制裡面一個事件是從DOM的最高一層向下傳播也就是說window對象是第一個接到事件的然後是document對象如此往下事件的產生對象反而是最後一個接到事件的
  如果要是一個對象捕獲某一個事件只需要調用captureEvent()方法如果要使一個對象把某一個事件向下傳而不處理此事件只需要對此對象使用releaseEvents方法即可下面考察一個簡單的事件捕獲和傳遞的例子
   
  圖一個Netscape的例子
  在這個例子裡有一個textbox和兩個button一個叫做Capture Event單擊後會使網頁的click事件被捕捉文字框中的計數會加一另一個叫做Release Event單擊後會使網頁的click事件不被捕捉
  使click事件被捕捉需要調用captureEvent()方法而使click事件不被捕捉需要調用releaseEvent()方法下面是具體的html和JavaScript代碼
   
  代碼清單JavaScript和HTML源代碼
  顯然一個事件可以在幾個不同的等級上得到處理這是一個不純的責任鏈模式
  Internet Explorer的事件模型
  Internet Explorer處理事件的方式與Netscape既相似又不同當一個事件發生在Internet Explorer所浏覽的網頁中時Internet Explorer會使用DHTML的Event Bubbling即事件浮升機制處理此事件Internet Explorer的DOM模型是html對象等級結構和事件處理機制在DOM裡面每一個html標示都是一個DOM對象而每一個DOM對象都可以產生事先定義好的幾個事件中的一個(或幾個)這樣的一個事件會首先發生在事件所屬的對象上然後向上傳播傳到此對象所屬的容器對象上如此等等因此事件浮升機制恰恰是事件捕捉機制的相反面
  在Event Bubbling機制裡面產生事件的對象首先會收到事件然後事件會依照對象的等級結構向上傳播比如一個DIV裡有一個FormForm裡面又有一個Button那麼當Button的onclick事件產生時Form的onclick事件代碼就會被執行然後事件就會傳到DIV對象如果DIV對象的onclick事件有任何代碼的話這代碼就會被執行然後事件繼續沿著DOM結構上行
  如果要阻止事件繼續向上傳播可以在事件鏈的任何一個節點上把cancelBubble性質設置成True即可
  Internet Explorer 浏覽器幾乎為所有的 HTML 標識符都提供了事件句柄因此Internet Explorer不需要captureEvents()方法和releaseEvents()方法來捕獲和釋放事件下面的JavaScript語句指定了document對象的onclick事件的處理方法
  documentonclick = functionName; 
  而下面的語句則停止了document對象對onclick事件的處理
  documentonclick = null; 
  因為事件處理性質被賦值nulldocument便沒有任何的方法處理此事件換言之null值禁止了此對象的事件處理這種方法可以用到任何的對象和任何的事件上面當然這一做法不適用於Netscape
  與Netscape中一樣一個事件處理方法可以返還Boolean值比如單擊一個超鏈接標記符是否造成浏覽器跟進取決於此超鏈接標記符的onclick事件是否返還true
  為了顯示Internet Explorer中的事件浮升機制本節特准備了下面的例子一個Form裡面有一個Button請見下圖
   
  圖一個Internet Explorer的例子
  其HTML代碼請見下面
   
  代碼清單JavaScript和HTML源代碼
  當myButton的onclick事件發生時myButton的事件處理首先被激發從而顯示出如下的對話窗
   
  圖myButton對象的事件處理被激發
  然後事件會象氣泡一樣浮升到上一級的對象即myForm對象上myForm對象的事件處理給出下面的對話窗
   
  圖myFormn對象的事件處理被激發
  這以後事件繼續浮升到更上一級的對象即body上這時document對象的事件處理被激發並給出下面的對象窗
   
  圖document對象的事件處理被激發
  這就是事件浮升(Event Bubbling)機制
  顯然這三級對象組成一個責任鏈而事件便是命令或請求當事件沿著責任鏈傳播時責任鏈上的對象可以選擇處理或不處理此事件不論事件在某一個等級上是否得到處理事件都可以停止上浮或繼續上浮這是不純的責任鏈模式
  責任鏈模式與其它模式的關系
  責任鏈模式與以下的設計模式相關
  復合模式(Composite Pattern) 當責任鏈模式中的對象鏈屬於一個較大的結構時這個較大的結構可能符合復合模式
  命令模式(Command Pattern) 責任鏈模式使一個特定的請求接收對象對請求或命令的執行變得不確定而命令模式使得一個特定的對象對一個命令的執行變得明顯和確定
  模版方法模式(Template Method) 當組成責任鏈的處理者對象是按照復合模式組成一個較大的結構的責成部分的話模版方法模式經常用來組織單個的對象的行為
  問答題
  第一題在稱為拱豬的紙牌游戲中四個參加者中由牌的可以選擇一個時機放出這張牌放出後四個人中的一個會不可避免地拿到這張
  請使用責任鏈模式說明這一游戲並給出UML結構圖
  第二題《墨子迎敵祠》裡描守城軍隊的結構城上步一甲一戟其贊三人五步有伍長十步有什長百步有佰長旁有大帥中有大將皆有司吏卒長
  一個兵勇需要上級批准以便執行一項任務他要向伍長請求批准伍長如果有足夠的權限便會批准或駁回請求如果他沒有足夠的權限便會向上級即什長轉達這個請求什長便會重復同樣的過程直到大將那裡一個請求最終會被批准或駁回然後就會象下傳直到傳回到發出請求的士兵手裡
  有些請求會很快返回有些則要經過較長的過程請求到底由誰批准事前並不知道請求的處理者並不是固定的有些軍官會晉升轉業或從別的單位轉過來等等
  請使用責任鏈模式解釋這個核准請求的結構
  (本例子受到文獻[ALPERT]裡Chain of Responsibility一節所給出的一個例子的啟發
  第三題王羲之在《蘭亭序》中寫道有清流激湍映帶左右引以為流觞曲水列坐其次講的是大伙列坐水畔隨水流放下帶羽毛的酒杯飲酒遠道而來的酒杯流到誰的面前誰就取而飲之
  在這個活動中參加者做成一排面對著一條彎曲的小溪侍者把酒杯盛滿酒讓酒杯沿著小溪向下漂流酒杯漂到一個參加者面前的時候他可以選擇取酒飲之也可以選擇讓酒杯漂向下家
  假設每一杯酒最終都會被參加者中之一喝掉那麼這個游戲是不是純的責任鏈模式?
  問答題答案
  第一題答案這是一個純的責任鏈模式
  首先牌放出之後每個人都只能要麼躲過要麼吃住牌便是責任鏈模式中的請求四個人便是四個處理者對象組成責任鏈
  每一個參加者的行為不僅僅取決於他手中的牌而且取決於他是否想得一個想收全紅的人可能會權力攬一個不想收全紅的人一般不想收除非他想阻止別人收因為一旦有人收全紅另外三個人就會復出較大的代價因此阻止別人收全紅的動機會促使一個參與者主動收有的時候放出牌的人也會想要得牌而得不到有的時候放出牌的人想要害人但卻害了自己
  這就是說到底是四個人中的哪一個人得到牌是完全動態決定的
  系統的UML結構圖如下
   
  圖紙牌游戲拱豬的UML類圖
  由於玩牌的時候可能有四人位置的任意調換或者有候補者在旁等待一旦在任的玩家被淘汰便可上任這樣四個人組成的牌局是動態變化的同時因為誰會拿到牌在每一局均會不同因此誰會放出牌也是動態的
  因此責任鏈的組成和順序變不是一成不變的而是動態的和變化的
  第二題答案墨子的守城部隊的等級結構可以用下面的對象圖表示
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27325.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.