• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            積木

            No sub title

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

            在描述對象之間的交互時,常會用到時序圖和協作圖,它們用來描述對象以及對象之間
            的消息。時序圖是以時間為序的表示方法,主要用來描述對象之間的時間順序。
            ----------------------------------
            時序圖(Sequen四Diagram) 描述了對象之間傳送消息的時間順序,它用來表示用例中
            的行為順序。當執行 個用例行為時,時序圖中的每條消息對應了 個類操作或狀態機中引
            起轉換的觸發事件。
            時序圖包含了4個元素,分別是對象(0均ect)、生命線(L悔line)、消息(Message) 和
            激活(Activation)。
            1  對象
            時序圖中對象的符號和對象圖中對象所用的符號一樣,都是使用矩形將對象名稱包含起來,
            并且對象名稱下有下劃線。將對象置于時序圖的頂部意味著在交互開始的時候
            對象就已經存在了,如果對象的位置不在頂部,那么表示對象是在交互的過程中被創建的。
            2  生命線
            生命線(Lifeline) 是一條垂直的虛線,表示時序圖中的對象在-段時間內的存在e 每個
            對象的底部中心的位置都帶有生命線。 生命線是-個時間線,從時序圖的頂部一直延伸到底
            部,所用的時間取決于交互持續的時間因對象與生命線結合在一起稱為對象的生命線,對象
            的生命線包含矩形的對象圖標以及圖標下面的生命線。
            提示: 實際上,對象的生命線可以代表一組對象.
            3  消息
            消息(Message) 定義的是對象之間某種形式的通信,它可以激發某個操作、喚起信號
            或導致目標對象的創建或撤銷。消息序列可以用兩種圖來表示:時序圖和協作圖。其中,時
            序圖強調消息的時間順序,而協作圖強調交換消息的對象間的關系。
            消息是兩個對象之間的單路通信,從發送方到接收方的控制信息流。消息可以用于在對
            象間傳遞參數。消息可以是信號,即明確的、命名的、對象間的異步通信;也可以是調用,
            即具有返回控制機制的操作的同步調用。
            在UML中,消息使用箭頭來表示,箭頭的類型表示了消息的類型,時序圖中常用的消息符號如下:

            注意:消息在生命線上所處的位置并不是消息求生的準確時間.只是一個相對的位里.如果一個消息位
            于另一個消息的上方,只說明它先于另一個消息被發送。
            .4激活
            時序圖可以描述對象的激活(Activation) 和去激活(Deactivation)。激活表示該對象被
            占用以完成某個任務,去激活指的是對象處于空閑狀態,在等待消息。在UML中,為了表
            示對象是激活的,可以將對象的生命線拓寬成為矩形。其中的矩形稱為激活
            條或控制期,對象就是在激活條的頂部被激活的。對象在完成自己的工作后被去激活,這通
            常發生在一個消息箭頭離開對象生命線的時候。
            ----------------------------------
            如果要撤銷一個對象,只要在其生命線終止點放置一個"X"符號即可,該點通常是對
            刪除或取消消息的回應。
            ----------------------------------
            時序圖建模
            一般情況下,會有很多時序圖,其中的一些是主要的,另一些用來描述可選擇的路徑或
            例外條件,可以使用包來組織這些時序圖的集合,并給每個圖起一個合適的名字,以便與其
            他圖相區別。
            按時間順序對控制流建模,要遵循如下策略。
            (1) 設置交互的語境,這些語境可以是系統、子系統、操作、類、用例或協作的腳本。
            (2) 通過識別對象在交互中扮演的角色,設置交互的場景。以從左到右的順序將對象放
            到時序圖的上方,其中較重要的放在左邊,與它們相鄰的對象放在右邊。
            (3)為每個對象設置生命線。通常情況下,對象存在于整個交互過程中。對于那些在交
            互期間創建和撤銷的對象,在適當的時刻設置它們的生命線,并用適當的構造型消息顯式地
            說明它們的創建和撤銷。
            (4) 從引發某個消息的信息開始,在生命線之間畫出從頂到底依次展開的消息,顯示每
            個消息的特性(如參數)。若有需要,解釋交互的語義。
            (5) 如果需要可視化消息的嵌套或實際計算發生時的時間點,可以用激活修飾每個對象
            的生命期。
            (6) 如果需要說明時間或空間的約束,可以用時間標記修飾每個消息,并附上合適的時
            間和空間約束。
            (7) 如果需要形式化地說明某控制流,可以為每個消息附上前置和后置條件。
            一個單獨的時序圖只能顯示一個控制流,通常說來,一個完整的控制流肯定是復雜的,
            所以,將 個大的流分為幾個部分放在不同的圖中是比較合適的。
            posted @ 2013-11-12 21:28 Jacc.Kim 閱讀(941) | 評論 (0)編輯 收藏

            活動圖是UML用于對系統的動態行為建模的另一種常用工具,它描述活動的順序,展
            現從一個活動到另一個活動的控制流.活動圖在本質上是一種流程圖。
            -------------------------------
            什么是活動?活動圖與狀態圖的區別是什么?
            活動是某件事情正在進行的狀態,既可以是現實生活中正在進行的某 項工作,也可以是軟
            件系統某個類對象的一個操作。活動在狀態機中表現為由一系列動作組成的非原子的執行過程。
            雖然活動圖與狀態圖都是狀態機的表現形式,但是兩者還是有本質區別·活動圖著重表
            現從一個活動到另一個活動的控制流,是內部處理驅動的流程:而狀態圖著重描述從一個狀
            態到另一個狀態的流程, 主要有外部事件的參與。
            -------------------------------
            活動圖的圖形表示
            在UML中,活動圖表示成圓角矩形,與狀態圖的圓角矩形相比,活動圖的矩形的圓角
            更柔和,看上去接近橢圓。活動圖的圖標包含對活動的描述(如活動名)。如果一個活動引發
            下一個活動,兩個活動的圖標之間用帶箭頭的直線連接。 與狀態圖類似,活動圈也有起點和
            終點,表示法和狀態圖相同。
            活動圖中還包括分支與合并、分叉與匯合等模型元素。 分支與合并的圖標和狀態圖中判定
            的圖標相同,而分叉與匯合則用一條加粗的線段表示。
            -------------------------------
            活動圖與流程圖的區別
            雖然活動圖描述系統使用的活動、判定點和分支,看起來和流程圖沒什么兩樣,并且傳
            統的流程圖所能表示的內容,大多數情況下也可以使用活動圖表示,但是兩者是有區別的,
            不能將兩個概念混淆。
            活動圖與流程圖的區別如下。
            (1)流程閣著重描述處理過程,它的主要控制結構是順序、分支和循環,各個處理過程
            之間有嚴格的順序和時間關系;而活動圖描述的是對象活動的順序關系所遵循的規則,它著
            重表現的是系統的行為,而非系統的處理過程。
            (2) 活動圖能夠表示并發活動的情形,而流程圖不能。
            (3) 活動圖是面向對象的,而流程圖是面向過程的.
            -------------------------------
            活動圖的組成元素
            UML的活動圖中包含的圖形元素有動作狀態、 活動狀態、動作流、分支與合并、分叉與
            匯合、泳道和對象流等。
            4  分支與合并
            動作流一般會自動進行控制轉換,直到遇到分支.分支在軟件系統流程中很常見,它­
            般用于表示對象類所具有的條件行為。一個無條件的動作流可以在一個動作狀態的動作完成
            后自動觸發動作狀態的轉換以激發下一個動作狀態,而有條件的動作流則需要根據條件,即
            一個布爾表達式的真假來判定動作的流向.條件行為用分支和合并表達。
            在活動圖中分支與合并用空心小菱形表示。分支包括一個入轉換和兩個帶條件的出轉
            換,出轉換的條件應當是互斥的,這樣可以保證只有一條出轉換能夠被觸發。合并包括兩個
            帶條件的入轉換和一個出轉換,合并表示從對應的分支開始的條件行為的結束。
            5  分支與匯合
            對象在運行時可能會存在兩個或者多個并發運行的控制流,為了對并發的控制流建饃,
            在UML中尋|入了分叉與匯合的概念,分叉用于將動作流分為兩個或者多個并發運行的分支,
            而匯合則用于同步這些并發分支,以達到共同完成一項事務的目的。
            分叉可以用來描述并發線程,每個分叉可以有一個輸入轉換和兩個或多個輸出轉換,每
            個轉換都可以是獨立的控制流。
            匯合代表兩個或多個并發控制流同步發生,當所有的控制流都達到匯合點后,控制才能
            繼續往下進行。每個匯合可以有兩個或多個輸入轉換和一個輸出轉換。
            分叉和匯合都使用加粗的水平線段表示。
            6  泳道
            泳道將活動圖中的活動化分為若干組,并把每一組指定給負責這組活動的業務組織.&P
            對象。 在活動圖中,泳道區分了負責活動的對象,它明確地表示了哪些活動是由哪些對象進
            行的。 在包含泳道的活動圖中,每個活動只能明確地屬于一個泳道。
            在活動圖中,泳道用垂直實線繪出,垂直線分隔的區域就是泳道。在泳道上方可以給出
            泳道的名字或對象(對象類〕的名字,該對象(對象類〉負責泳道內的全部活動。泳道沒有
            順序,不同泳道中的活動既可以順序進行也可以并發進行,動作流和對象流允許穿越分隔線。
            7 對象流
            對象流是動作狀態或者活動狀態與對象之間的依賴關系,表示動作使用對象或者動作對
            對象的影響。 用活動圖描述某個對象時,可以把涉及到的對象放置在活動圖中并用一個依賴
            將其連接到進行創建;修改和撤銷的動作狀態或者活動狀態上,對象的這種使用方法就構成
            了對象流。
            對象流中的對象有如下特點·
            (1)  個對象可以由多個動作操縱,
            2)一個動作輸出的對象可以作為另一個動作輸入的對象:
            (3)在活動圖中,同一個對象可以多次出現,它的每-次出現表明該對象正處于對象生
            存期的不同時間點.
            在活動圖中,對象流用帶有箭頭的虛線表示。如果箭頭從動作狀態出發指向對象,則表
            示動作對對象施加了一定的影響。施加的影響包括創建、修改和撤銷等。如果箭頭從對象指
            向動作狀態,則表示該動作使用對象流所指向的對象。
            -------------------------------
            活動的分解
            一個活動可以分為若干個動作或子活動,這些動作和子活動本身又可以組成一個活動
            圖。不含內嵌活動或動作的活動稱之為簡單活動:嵌套了若干活動或動作的活動稱之為組合
            活動,組合活動有自己的名字和相應的子活動圖。
            -------------------------------
            活動圖建模技術
            在系統建模的過程中,活動圖能夠附加到任何建模元素中以描述其行為,這些元素包括
            用例、類、接口、節點、協作、操作和方法等。通常來說,用活動圖對工作流建模可遵循如
            下步驟:
            (1)識別要對工作流描述的類或對象a 找出負責工作流實現的業務對象,這些對象可以
            是顯示業務領域的實體,也可以是一種抽象的概念和事物。找出業務對象的目的是為每一個
            重要的業務對象建立泳道。
            (2) 確定工作流的初始狀態和終止狀態,明確工作流的邊界。
            (3)對動作狀態或活動狀態建模。找出隨時間發生的動作和活動,將它們表示為動作狀
            態或活動狀態。
            (4) 對動作流建模。對動作流建模時可以首先處理順序動作,接著處理分支與合并等條
            件行為,然后處理分叉與匯合等并發行為。
            (5) 對對象流建模。找出與工作流相關的重要對象,并將其連接到相應的動作狀態和活
            動狀態。
            (6) 對建立的模型進行精化和細化。
            posted @ 2013-11-12 00:42 Jacc.Kim 閱讀(541) | 評論 (0)編輯 收藏

            狀態圖是系統分析的一種常用工具,它通過建立類對象的生存周期模型來描述對象隨時
            間變化的動態行為。
            ----------------------------
            狀態機是展示狀態與狀態轉換的圖。在面向對象分析與設計中,對象的狀態、狀態的轉
            換、觸發狀態轉換的事件、對象對事件的響應(即事件的行為〉都可以用狀態圖來描述。
            UML用狀態機對軟件系統的動態特征建模。 通常一個狀態機依附于一個類,并且描述­
            個類的實例(即對象的狀態機包含了一個類的對象在其生命期間所有狀態的序列以及對象對
            接收到的事件所產生的反應。
            ----------------------------
            狀態機由狀態、轉換、事件、活動和動作5部分組成。
            (1)狀態表示一個模型在其生存期內的狀況,如滿足某些條件、執行某些操作或等待某
            些事件。一個狀態的生存期是有限的一個時間段.
            (2) 轉換表示兩個不同狀態之間的聯系,事件可以觸發狀態之間的轉換.
            (3)事件是在某個時間產生的,可以觸發狀態轉換的,如信號、對象的創建和銷毀、超
            時和條件的改變等。
            (4) 活動是在狀態機中進行的一個非原子的執行,由一系列動作組成。
            (5) 動作是一個可執行的原子計算,它導致狀態的變更或者返回一個值。
            狀態機不僅可以用于描述類的行為,也可以描述用例、協作和方法甚至整個系統的動態行為。
            ----------------------------
            狀態圖由表示狀態的節點和表示狀態之間轉換的帶箭頭的直線組成。若干個狀態由一條
            或者多條轉換箭頭連接,狀態的轉換由事件觸發。模型元素的行為可以由狀態圖中的一條通
            路表示,沿著此通路狀態機隨之執行了一系列動作。
            組成UML的圖形元素有狀態、轉換、初始狀態、終結狀態和判定等。
            (1) 狀態由一個帶圓角的矩形表示,狀態圖的圖標可以分為3部分: 名稱、內部轉換和嵌套
            狀態圖。
                    a) 名稱表示狀態的名字,通常用字符串表示
                    b) 內部轉換。在內部轉換中可以包含進入或者走出此狀態應該執行的活動或動作,它
            們將響應對象所接收到的事件,但是不改變對象的狀態。
                    c) 嵌套狀態圖。狀態圖中的狀態有兩種·一種是簡單狀態,簡單狀態不包含其他狀態;
            一種是組合狀態,組合狀態是包含子狀態的狀態。在組合狀態的嵌套狀態圖部分包含的就是
            此狀態的子狀態。
            (2) 轉換用帶箭頭的直線表示,一端連接源狀態,即轉出的狀態,箭頭一端連接目標狀態,
            即轉入的狀態。轉換可以標注與此轉換相關的選項,如事件、動作和監護條件。
            注意: 如果轉換上沒有標注觸發轉換的事件,則表示此轉換為自動進行.
            (3) 每個狀態圖都應該有 個初始狀態,此狀態代表狀態圖的起始位置。初始狀態只能作為
            轉換的源,而不能作為轉換的目標。起始狀態在一個狀態圖中只允許有一個,用一個實心的
            圓表示。
            (4) 終止狀態是模型元素的最后狀態,是一個狀態圖的終止點。終止狀態只能作為轉換的目
            標,而不能作為轉換的源。終止狀態在一個狀態圖中可以有多個,它用 個含有實心圓的空
            心圓表示。
            (5) 判定處在狀態圖中這樣一個位置: 工作流在此處按監護條件的取值而發生分支。 判定用
            空心小菱形表示。因為監護條件為布爾表達式,所以通常條件下的判定只有一個入轉換和兩
            個出轉換。根據監護條件的真假可以觸發不同的分支轉換。
            ----------------------------
            入口動作和出口動作表示進入或退出某個狀態所要執行的動作。入口動作用"entry/要執
            行的動作"表達,而出口動作用"exit/要執行的動作"表達。
            ----------------------------
            事件表示在某一特定的時間或空間出現的能夠引發狀態改變的運動變化,如接收到的從
            一個對象對另一個對象發送的信號、某些值的改變或一個時間段的終結。事件是一個激勵的
            出現, 它定義一個觸發子以觸發對象改變其狀態,任何影響對象的事物都可以是事件。
            事件有多種,大致可分為入口事件、出口事件、動作事件、信號事件、調用事件、修改
            事件、時間事件和延遲事件等兒種。
            1  入口事件
            入口事件表示 個入口的動作序列,它在進入狀態時執行。入口事件的動作是原子的,
            并且先于人和內部活動或轉換。
            2  出口事件
            出口事件表示一個出口的動作序列,它在退出狀態時執行。出口事件也是原子的,它跟
            在所有的內部活動之后,但是先于所有的出口轉換。
            3  動作事件
            動作事件也稱為"do 事件".它表示對一個嵌套狀態機的調用。與動作事件相關的活動
            必定引用嵌套狀態機,而非引用包含它的對象的操作。
            4  信號事件
            信號是兩個對象之間的通信媒介,信號的接收是信號接收對象的一個事件。 信號分為異
            步單路通信和雙路通信.在異步單路通信中,發送者是獨立的,它不必等待接收者處理信號.
            在雙路通信模型中,至少在每個方向上都要有一個信號,這就是所謂的多信號B 在信號事件
            中,發送者和接收者可以是同一個對象。
            5  調用事件
            調用事件是一個對象對調用的接收,這個對象用狀態的轉換而不是用固定的處理過程實
            現操作。調用事件至少涉及兩個以上的對象,一個對象請求調用另 個對象的操作。 對調用
            者來說,一旦調用的接收對象通過囪事件觸發的轉換完成了對調用事件的處理或調用失敗,
            而沒有進行任何狀態轉換,則控制返回到調用對象。 調用事件既可以為同步調用,也可以為
            異步調用。如果調用者需要等待操作的完成,則是同步調用,否則是異步調用.
            6  修改事件
            修改事件依靠特定屬性值的布爾表達式所表示的條件的滿足來觸發狀態的轉換. 它表示
            了一種具有時間持續性的并且可能是涉及全局的計算過程,測試修改事件的代價可能很大,
            因為原則上修改事件是持續不斷的。
            監護條件與修改事件的區別在于監護條件只是在引起轉換的觸發器事件觸發時和事件
            接收者對事件進行處理時被賦值 次,而修改事件則可以被多次賦值直到條件為真,多次賦
            值滿足條件后轉換也會被激發。
            7  時間事件
            時間事件代表時間的流逝。
            8  延遲事件
            延遲事件是在本狀態不處理,要推遲到另外一個狀態才處理的事件。 通常,在一個狀態
            生存期出現的事件若不被立即響應就會丟失.但是,這些未立即觸發轉換的事件可以放在一
            個內部的延遲事件隊列中,等待需要時觸發或者撤消, 如果一個轉換依賴一個存在于內部延
            遲事件隊列中的事件,則事件立即觸發轉換:如果存在多個轉換,則內部延遲事件隊列中的
            第一個事件將有優先觸發相應轉換的權利。
            ----------------------------
            轉換表示當一個特定事件發生或者某些條件得到滿足時,一個源狀態下的對象在完成一
            定的動作后將發生狀態轉變,轉向另 個稱之為目標狀態的狀態。當發生轉換時,轉換進入
            的狀態為活動狀態,轉換離開的狀態變為非活動狀態.

            轉換通常分為外部轉換、內部轉換、完成轉換和復合轉換4種。一個轉換一般包括5部
            分的信息:源狀態、目標狀態、 觸發事件、監護條件和動作。

            1  外部轉換
            外部轉換是一種改變對象狀態的轉換,它是戰常見的一種轉換。外部轉換用從源狀態到
            目標狀態的箭頭表示。
            2  內部轉換
            內部轉換有一個源狀態但是沒有目標狀態,它轉換后的狀態仍舊是它本身。 內部轉換的
            激發規則和改變狀態的外部轉換的激發規則相同,如果一個內部轉換帶有動作,動作也要被
            執行。內部轉換用于對不改變狀態的插入動作建立模型,例如建立幫助信息。
            內部轉換和自轉換不同, 自轉換是離開本狀態后重新進入
            該狀態,它會激發狀態的入口動作和出口動作的執行;而內部轉換自始至終都不離開本狀態,
            所以沒有出口或入口事件,也就不執行入口和出口動作。內部轉換和入口動作或出口動作采
            用相似的表示方法。
            4  復合轉換
            復合轉換由簡單轉換組成,這些簡單轉換通過分支判定、分叉或接合組合在一起.前
            面所講的由判定參與的轉換就是復合轉換.除了簡單的兩個分支的判定,還有多條件的分
            支判定.多條件的分支判定又分為鏈式的和非鏈式的分支。
            5  觸發事件
            狀態機描述了對象的具有事件驅動的動態行為,對象動作的執行、狀態的改變都是以特
            定事件的發生為前提的,觸發事件就是能夠引起狀態轉換的事件。觸發事件可以是信號、調
            用和時間段等。
            6  監護條件
            轉換可能具有一個監護條件,監護條件是觸發轉換必須滿足的條件,它是一個布爾表達
            式。 當事件被觸發時,監護條件被賦值. 如果布爾表達式的值為真,那么轉換被觸發;如果
            布爾表達式的值為假,則不會引起轉換。 監護條件只能在觸發事件發生時被賦值一次,如果
            在轉換發生后監護條件才由假變為真,那么轉換也不會被觸發。
            從 個狀態引出的多個轉換可以有同樣的觸發器事件,但是每個轉換必須具有不同的監
            護條件。當其中一個監護條件滿足時,觸發器事件會引起相應的轉換,監護條件應該確保
            個觸發器事件的發生能夠引起某些轉換。
            7  動作
            動作是一組可執行語句或者計算處理過程。動作可以包括發送消息給另一個對象、操作
            調用、設置返回值、創建和銷毀對象等。動作也可以是一個動作序列,即一系列簡單的動作
            的組合。動作是原子的,不可中斷的,動作或動作序列的執行不會被同時發生的其他動作影
            響或終止。 動作的執行時間非常短,與外界事件所經歷的時間相比是可以忽略的,因此,在
            動作的執行過程中不能再插入其他事件.
            整個系統可以在同一時間執行多個動作。動作在它的控制線程中是原子性的,一旦開始
            執行就必須執行到底并且不能與同時處于活動狀態的動作發生交互作用。與系統處理外部事
            件所需要的反應時間相比,動作的執行過程應該簡潔到能做出實時響應。
            ----------------------------
            狀態圖建模技術
            狀態圖一般用于對系統中的某些對象,比如類、用例和系統的行為建模。建模的時候要
            找出對象所處的狀態、 觸發狀態改變的動作,以及對象狀態改變時應執行的動作.具體的建
            模步驟如下。
            (1)找出適合用模型描述其行為的類。
            (2)確定對象可能存在的狀態。
            (3)確定引起狀態轉換的事件。
            (4) 確定轉換進行時對象執行的相應動作,
            (5) 對建模的結果進行相應的精化和細化。
            posted @ 2013-11-11 22:33 Jacc.Kim 閱讀(450) | 評論 (0)編輯 收藏

            類圖(ClassDiagram) 是描述類、接口、協作以及它們之間關系的圖,用來顯示系統中
            各個類的靜態結構。類圖是一種模型類型,確切地說,是一種靜態模型類型。
            類圖是面向對象系統建模中最常用的圖,它是定義其他圖的基礎,在類圖的基礎上,可
            以使用狀態圖、協作圖、組件圖和配置圖等進一步描述系統其他方面的特性。
            類圖包含7 個元素:類(Class)、接口(1nterface )、協作(Collaboratio川、依賴關系
            ( Dependency )、泛化關系(Generalization)、關聯關系(Association)以及實現關系(Realization) 。
            說明:其實還有聚合、組合。
            另外,所謂的協作,其實就是指各類、接口間存在的各種關系。因此,各類間一般不是孤立存在的。
            注意:
            A) 在UML中,公有類型用"+"表達,私有類型用"-"表達,而受保護類型則用"# "表達。UML的類中不存在
            默認的可見性,如果沒有顯示任何一種符號,就表示沒有定義該屬性的可見性。
            B) 。類中操作的可見性主要包括公有(PubliC)、私有(Private)、受保護(Protected)
            和包內公有(Package) 4種,分別用"+"、"-"、"#"和"~"來表示。
            其中,只要調用對象能夠訪問操作所在的包,就可以調用可見性為公有的操作;只有屬
            于同一個類的對象才可以調用可見性為私有的操作,只有子類的對象才可以調用父類的可見
            性為受保護的操作:只有在同一個包里的對象才可以調用可見性為包內公有的操作。
            ----------------------
            UML定義了4種基本依賴類型,分別是使用(Usage) 依賴、抽象CAbstraction) 依賴、
            授權(Permission) 依賴和綁定CBinding) 依賴.其中,使用依賴是類中最常用的依賴。
            在實際建鎮中.3 種情況下產生使用依賴:客戶類的操作需要提供者類的參數:客戶類的
            操作返回提供者類的值;客戶類的操作在實現中使用提供者類的對象。使用的構造型
            包括調用和實例。在實際建模中,調用依賴和參數依賴較少被使用。發送依賴規定
            客戶把信號發送到非指定的目標,實例化依賴則規定客戶創建目標元素的實例。
            ---------------------
            關聯關系(Association )
            關聯關系是一種結構關系,它指明一個事物的對象與另一個事物的對象之間的聯系。也
            就是說,關聯描述了系統中對象或實例之間的離散連接。關聯的任何一個連接點都叫做關聯
            端,與類有關的許多信息都附在它的端點上。在UML中,關聯關系用一條連接兩個類的實
            線表示。
            ---------------------
            聚合(Aggregation )。聚合關系是一種特殊類型的關聯,它表示整體與部分關系的
            關聯。簡單的說,關聯關系中一組元素組成了一個更大、更復雜的單元,這種關聯關系就是
            聚合。聚合關系描述了"has a" 的關系。在UML中,聚合關系用帶空心菱形頭的實線來表
            示,其中頭部指向整體。
            ---------------------
            組合關系(Composition)。組合關系是聚合關系中的一種特殊情況,是更強形式的
            聚合,又被稱為強聚合e 在組合中,成員對象的生命周期取決于聚合的生命周期,聚合不僅
            控制著成員對象的行為,而且控制著成員對象的創建和解構。在U孔伍中,組合關系用帶實
            心菱形頭的實線來表示,其中頭部指向整體。
            ---------------------
            導航性(Navigation)。導航性描述的是一個對象通過鏈(關聯的實例〉進行導航訪
            問另一個對象,即對一個關聯端點設置導航屬性意味著本端的對象可以被另 端的對象訪問。
            可以在關聯關系上加箭頭表示導航方向。只在一個方向上可以導航的關聯稱為單向關聯
            (Unidirectional Association),用→條帶箭頭的實線來表示,如圖6-23所示:在兩個方向上都
            可以導航的關聯稱為雙向關聯(Bidirectional Association),用一條沒有箭頭的實線來表示。
            另外,使用導航性可以降低類間的精合度,這也是好的面向對象分析與設計的目標之一。
            ----------------------
            對象圖<ObjectDiagram) 描述的是參與交互的各個對象在交互過程中某一時刻的狀態·
            對象圖可以被看作是類圖在某一時刻的實例。 在U阻中,對象圖使用的是與類圖相同的
            符號和關系,因為對象就是類的實例。
            posted @ 2013-11-10 21:16 Jacc.Kim 閱讀(398) | 評論 (0)編輯 收藏

            1) 用例圖包含6個元素,分別是:參與者(Actor)、用例(UseCase)、關聯關系(Association) 、
            包含關系(Include)、擴展關系(Extend) 以及泛化關系(Generalization)。

            2) 參與者有三大類:系統用戶、與所建造的系統交互的其他系統和一些可以運行的進程。
            第一類參與者是真實的人,即用戶,是最常用的參與者,幾乎存在于每一個系統中。命
            名這類參與者時,應當按照業務而不是位置命名,因為一個人可能有很多業務。例如汽車租
            賃公司的客戶服務代表,通常情況下是客戶服務代表,但是如果他(她)自己要租車的時候,
            就變成了客戶,所以,按照業務而不是位置命名可以獲得更穩定的參與者。
            第二類參與者是其他的系統.例如汽車租賃系統可能需要與外部應用程序建立聯系,驗
            證信用卡以便付款。 其中,外部信用卡應用程序是一個參與者,是另一個系統。因此在當前
            項目的范圍之外,需要建立與其他系統的接口。這類位于程序邊界之外的系統也是參與者。
            第三類參與者是一些可以運行的進程,如時間。當經過一定時間出發系統中的某個事件
            時,時間就成了參與者。例如,在汽軍租賃系統中,到了還車的時間客戶還沒有歸還汽車,
            系統會提醒客戶服務代表致電客戶。 由于時間不在人的控制之內,因此它也是一個參與者。
            注意:參與者之間,還存在著一般化與特殊化的關系。一般用泛化關系來表示。具體表示法
            同類的泛化關系相同。

            3) 用例是外部可見的系統功能單元,這些功能由系統單元所提供,并通過-系列系統單元
            與一個或多個參與者之間交換的消息所表達。用例的用途是,在不揭示系統內部構造的前提
            下定義連貫的行為。
            在系統層,用例表示整個系統對外部用戶可見的行為。-個用例就像外部用戶可以使用
            的系統操作。但是,它又與操作不同,用例可以在執行過程中持續接受參與者的輸入信息。

            4) 識別用例
            識別用例最好的方法就是從分析系統的參與者開始,考慮每個參與者是如何使用系統
            的。使用這種策略的過程中可能會發現新的參與者,這對完善整個系統的建模有很大的幫助。
            用例建模的過程就是一個法代和逐步精華的過程,系統分析者首先從用例的名稱開始,然后
            添加用例的細節信息。這些信息由簡短的描述組成,它們被精華成完整的規格說明。
            在識別用例的過程中,通過回答以下的兒個問題,系統分析者可以獲得幫助。
            (1)特定參與者希望系統提供什么功能。
            (2)系統是否存儲和檢索信息,如果是,由哪個參與者觸發。
            (3)當系統改變狀態時,是否通知參與者。
            (4) 是否存在影響系統的外部事件。
            (5) 哪個參與者通知系統這些事件。

            5) 用例間的關系
            用例除了與其參與者發生關聯外,還可以具有系統中的多個關系,這些關系包括關聯關系、
            包含關系、擴展關系和泛化關系。應用這些關系的目的是為了從系統中抽取出公共行為和
            其變體。
            1  關聯關系(Association )
            關聯關系表示參與者用例之間的通信。
            2  包含關系(Include )
            雖然每個用例的實例都是獨立的,但是一個用例可以用其他的更簡單的用例來描述。這
            有點像通過繼承父類并增加附加描述來定義一個類。 個用例可以簡單地包含其他用例具有
            的行為,并把它所包含的用例行為作為自身行為的一部分,這被稱作包含關系。在這種情況
            下,新用例不是初始用例的一個特殊例子,并且不能被初始用例所代替。在m伍中,包含
            關系表示為虛線箭頭加<<include> >字樣,箭頭指向被包含的用例。
            包含關系使-個用例的功能可以在另一個用例中使用,如下所述。
            (1)如果兩個以上用例有大量一致的功能,則可以將這個功能分解到另 個用例中o 其
            他用例可以和這個用例建立包含關系。
            (2) 一個用例的功能太多時,可以用包含關系建模兩個小用例。
            3 擴展關系(Extend )
            一個用例也可以被定義為基礎用例的增量擴展,這稱作擴展關系,擴展關系是把新的行
            為插入到已有用例中的方法。同一個基礎用例的幾個擴展用例可以在一起應用。擴
            展關系表示為虛線箭頭加<<extend>>字樣,箭頭指向被擴展的用例(即基礎用例。
            基礎用例提供了一組擴展點,在這些新的擴展點中可以添加新的行為,而擴展用例提供
            了一組插入片段,這些片段能夠被插入到基礎用例的擴展點上。基礎用例不必知道擴展用例
            的任何細節,它僅為其提供擴展點。事實上,基礎用例即使沒有擴展用例也是完整的,這點
            與包含關系有所不同。擴展關系為處理異常或構建靈活的系統框架提供了一種十分有效的方法。
            4. 泛化關系(Generaliza苗。n)
            一個用例可以被特別列舉為一個或多個子用例,這被稱作用例泛化。當父用例能夠被使
            用時,任何子用例也可以被使用。在UML中,用例泛化與其他泛化關系的表示法相同,用
            一個三角箭頭從子用例指向父用例。
            posted @ 2013-11-10 20:13 Jacc.Kim 閱讀(383) | 評論 (0)編輯 收藏

            總體來說.UML由以下幾個部分構成。
            (1)視圖。視圖是表達系統的某方面特征的UML建模元素的子集,視圖并不是圖,
            它是由一個或者多個圖組成的對系統某個角度的抽象。在建立一個系統模型時,通過定義多
            個反映系統不同方面的視圖,才能對系統做出完整、精確的描述。
            說明:一般情況下,視圖又可以分為多種不同層次、不同功能用途的視圖:
                    a) 用例視圖、b) 邏輯視圖、c) 并發視圖、d) 組件視圖、e) 配置視圖
            (2) 圖。視圖由圖組成.UML通常提供9種基本的圖,把這幾種基本圖結合起來就可以
            描述系統的所有視圖。
            說明:
                    a) 在UML1.4時代,基本的9種圖分別為:用例圖、活動圖、時序圖、協作圖、類圖、狀態圖、對象圖、組件圖、部署圖。
                    b) 在UML2.0時代,還擴展了其他的幾種圖。如:交互圖等等。
            (3)模型元素。 UML中的模型元素包括事物和事物之間的聯系。事物描述了一般的面向
            對象的概念,如類、對象、接口、消息和組件等.事物之間的關系能夠把事物聯系在一起,
            組成有意義的結構模型。常見的聯系包括關聯關系、依賴關系、泛化關系、實現關系和聚合
            關系.同一個模型元素可以在幾個不同的UML圖中使用,不過同一個模型元素在任何圖中
            都保持相同的意義和符號。
            說明:
                    a) UML模型元素一般為:類、對象、活動、用例、協作、狀態、接口、以及種事件關系等等。
            (4)通用機制。UML提供的通用機制可以為模型元素提供額外的注釋、信息或語義.這
            些通用機制同時提供擴展機制,擴展機制允許用戶對UML進行擴展,以便適應一個特定的
            方法/過程、組織或用戶。
            說明:常用的通用機制為:a) 修飾、b) 注釋、c) 規格說明、d) 通用劃分、e) 擴展機制。
            posted @ 2013-11-10 18:51 Jacc.Kim 閱讀(313) | 評論 (0)編輯 收藏

            看完以下概述,即可明白何為A星算法。

            關于什么是A星算法,上網一查便知。在此只簡要記錄一些有關A星算法的要點
            一:f、g、h值
            f值:即:算法的估價值。是指對某一點的估價值。例如:要想從起點 S 到達終點 D,則中間可能會經過n個點,假如其中經過點:X ,則f(X),就是對點x的計算所得的估價值。當然,對于估價值,是越小越好。
            g值: 即:從起點 S 到達點 X 實際所花的代價值。例如:以格子數為計量單位。則g值表示,從S到X所經過的格子數,即為實際所花費的代價值
            h值: 即:從點 X 到達終點 D 可能要花費的值。也就是所謂的估計值,猜測值。這個值根據不同的應用,實現策略,將會有不同的結果。當然值越小是越好的。理由是:f(X) = g(X) + h(X) 。因為g(X)值是固定的,已知的。所以要想f(X)值越小,則只能h(X)的值越小。

            二:節點與地圖位置點
            地圖位置點不言而喻,是指地圖上的某個具體點,因此,只要地圖的劃分方法確定,則地圖位置點必然確定。
            節點是A星算法中所需要依賴的數據信息存儲相關的點。與地圖位置點不同。節點中所存儲的數據信息是靈活多變的。同時,同一個節點,可能對應于不同的地圖位置點。一般情況下,節點中會存儲地圖位置點信息、當前節點的f、g、h值等等。
            !!!note: 在A星算法中,節點只分為兩類。一類是:待考察的節點。一類是:已考察的節點。
            已考察節點是指:當所有與節點X相關連的節點的f、g、h值均已被賦值并且這些節點均已被添加到open表中時,則節點X就是已經被考察過了。

            三:open表與closed表
            open表中所存儲的元素,全部都是需要進一步進行考察的節點。
            closed表中所存儲的元素,全部都是已經被考察過了的節點。

            四:A星算法的實現步驟
                1) 令 P = 起始節點
                2) 把 f, g, h 值賦給 P
                3) 將 P 添加到 Open 表中。此時 P 是 Open 表中唯一的節點。
                4) 令 B = Open 表中的最佳節點。(提示:所謂最佳節點是指:該節點的 f 值最小)
                    (1) 如果 B 是目標節點,則退出。此時已找到一條路徑。
                    (2) 如果 Open 表為空,則退出。此時沒有找到路徑。
                5) 令 C 等于一個與 B 相連的有效節點。
                    (1) 把 f, g, h 的值賦給 C。
                    (2) 檢查 C 是在 Open 表里,還是在Closed表里。
                        2.1: 若在 Closed 表里,則檢查新路徑是否比原先更好,若是則采用新路徑。
                        2.2: 否則把 C 添加到 Open 表里.
                    (3) 對所有 B 的子孫節點重復步驟 5).
                6) 重復步驟 4).
            posted @ 2013-06-23 12:37 Jacc.Kim 閱讀(1390) | 評論 (0)編輯 收藏

            轉載自:http://blog.sina.com.cn/s/blog_6056c8830100zh1c.html

            對于普通類型的對象來說,它們之間的復制是很簡單的,例如:

            int a=88;
            int b=a;
            而類對象與普通對象不同,類對象內部結構一般較為復雜,存在各種成員變量。下面看一個類對象拷貝的簡單例子。

            #include <iostream>
            using namespace std;

            class
            CExample
            {
            private
            :
             
            int
            a;
            public
            :
             CExample(
            int
            b)
             
            { a=b;}
             
            void Show ()
             
            {
            cout
            <<a<<
            endl;
            }

            }
            ;

            int
            main()
            {
             CExample A(
            100
            );
             CExample B
            =
            A;
             B.Show ();
             
            return 0
            ;
            }

            運行程序,屏幕輸出100。從以上代碼的運行結果可以看出,系統為對象B分配了內存并完成了與對象A的復制過程。就類對象而言,相同類型的類對象是通過拷貝構造函數來完成整個復制過程的。下面舉例說明拷貝構造函數的工作過程。

            #include <iostream>
            using namespace std;

            class
            CExample
            {
            private
            :
            int
            a;
            public
            :
            CExample(
            int
            b)
            { a=b;}

            CExample(
            const CExample& C)
            {
            a
            =
            C.a;
            }

            void Show ()
            {
            cout
            <<a<<
            endl;
            }

            }
            ;

            int
            main()
            {
            CExample A(
            100
            );
            CExample B
            =
            A;
            B.Show ();
            return 0
            ;
            }

            CExample(const CExample& C)就是我們自定義的拷貝構造函數。可見,拷貝構造函數是一種特殊的構造函數,函數的名稱必須和類名稱一致,它的唯一的一個參數是本類型的一個引用變量,該參數是const類型,不可變的。例如:類X的拷貝構造函數的形式為X(X& x)。

            當用一個已初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用。也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。以下情況都會調用拷貝構造函數:
            一個對象以值傳遞的方式傳入函數體
            一個對象以值傳遞的方式從函數返回
            一個對象需要通過另外一個對象進行初始化。

            如果在類中沒有顯式地聲明一個拷貝構造函數,那么,編譯器將會自動生成一個默認的拷貝構造函數,該構造函數完成對象之間的位拷貝。位拷貝又稱淺拷貝,后面將進行說明。

            自定義拷貝構造函數是一種良好的編程風格,它可以阻止編譯器形成默認的拷貝構造函數,提高源碼效率。

            淺拷貝和深拷貝

              在某些狀況下,類內成員變量需要動態開辟堆內存,如果實行位拷貝,也就是把對象里的值完全復制給另一個對象,如A=B。這時,如果B中有一個成員變量指針已經申請了內存,那A中的那個成員變量也指向同一塊內存。這就出現了問題:當B把內存釋放了(如:析構),這時A內的指針就是野指針了,出現運行錯誤。

              深拷貝和淺拷貝可以簡單理解為:如果一個類擁有資源,當這個類的對象發生復制過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。下面舉個深拷貝的例子。

            #include <iostream>
            using namespace std;
            class CA
            {
             public:
              CA(int b,char* cstr)
              {
               a=b;
               str=new char[b];
               strcpy(str,cstr);
              }
              CA(const CA& C)
              {
               a=C.a;
               str=new char[a]; //深拷貝
               if(str!=0)
                strcpy(str,C.str);
              }
              void Show()
              {
               cout<<str<<endl;
              }
              ~CA()
              {
               delete str;
              }
             private:
              int a;
              char *str;
            };

            int main()
            {
             CA A(10,"Hello!");
             CA B=A;
             B.Show();
             return 0;
            }

            深拷貝和淺拷貝的定義可以簡單理解成:如果一個類擁有資源(堆,或者是其它系統資源),當這個類的對象發生復制過程的時候,這個過程就可以叫做深拷貝,反之對象存在資源,但復制過程并未復制資源的情況視為淺拷貝。

            淺拷貝資源后在釋放資源的時候會產生資源歸屬不清的情況導致程序運行出錯。

            Test(Test &c_t)是自定義的拷貝構造函數,拷貝構造函數的名稱必須與類名稱一致,函數的形式參數是本類型的一個引用變量,且必須是引用。

            當用一個已經初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用,如果你沒有自定義拷貝構造函數的時候,系統將會提供給一個默認的拷貝構造函數來完成這個過程,上面代碼的復制核心語句就是通過Test(Test &c_t)拷貝構造函數內的p1=c_t.p1;語句完成的。
            posted @ 2013-03-15 17:49 Jacc.Kim 閱讀(328) | 評論 (0)編輯 收藏

            許多時候,設計項目,日志是必不可少的。
            比如:有時候你自己就是覺得自己設計的功能,肯定沒有問題。可偏偏別人會說你設計的有問題。這時候,如果沒有日志報告,則你只能調試跟代碼。如此必須浪費許多時間。(這點本人也是感受很深啦)。相反,如果有了日志報告,則一看,就清楚是否真的有問題,以及問題出在哪里。。
            于是,基于此體會,以下是本人設計的一個日志服務提供器。雖然,簡單,但可以提供十分便捷的日志服務。(個人認為十分好用)

            提示:具體文件,可從附件下載。
            附件共4個文件:
            LogUserConfig.h
            LogConfig.h
            LogProvider.h
            LogProvider.cpp

            附件:
            LogProvider.zip
            posted @ 2013-03-13 12:51 Jacc.Kim 閱讀(985) | 評論 (2)編輯 收藏

                static std::wstring MBytesToWString(const char* lpcszString);
                
            static std::string WStringToMBytes(const wchar_t* lpwcszWString);
                
            static std::wstring UTF8ToWString(const char* lpcszString);
                
            static std::string WStringToUTF8(const wchar_t* lpwcszWString);

            std::wstring KKLogObject::MBytesToWString(const char* lpcszString)
            {
                
            int len = strlen(lpcszString);
                
            int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, lpcszString, -1, NULL, 0);
                wchar_t
            * pUnicode = new wchar_t[unicodeLen + 1];
                memset(pUnicode, 
            0, (unicodeLen + 1* sizeof(wchar_t));
                ::MultiByteToWideChar(CP_ACP, 
            0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
                wstring wString 
            = (wchar_t*)pUnicode;
                delete [] pUnicode;
                
            return wString;
            }

            std::
            string KKLogObject::WStringToMBytes(const wchar_t* lpwcszWString)
            {
                
            char* pElementText;
                
            int iTextLen;
                
            // wide char to multi char
                iTextLen = ::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, -1, NULL, 0, NULL, NULL);
                pElementText 
            = new char[iTextLen + 1];
                memset((
            void*)pElementText, 0, (iTextLen + 1* sizeof(char));
                ::WideCharToMultiByte(CP_ACP, 
            0, lpwcszWString, 0, pElementText, iTextLen, NULL, NULL);
                std::
            string strReturn(pElementText);
                delete [] pElementText;
                
            return strReturn;
            }

            std::wstring KKLogObject::UTF8ToWString(
            const char* lpcszString)
            {
                
            int len = strlen(lpcszString);
                
            int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0);
                wchar_t
            * pUnicode;
                pUnicode 
            = new wchar_t[unicodeLen + 1];
                memset((
            void*)pUnicode, 0, (unicodeLen + 1* sizeof(wchar_t));
                ::MultiByteToWideChar(CP_UTF8, 
            0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
                wstring wstrReturn(pUnicode);
                delete [] pUnicode;
                
            return wstrReturn;
            }

            std::
            string KKLogObject::WStringToUTF8(const wchar_t* lpwcszWString)
            {
                
            char* pElementText;
                
            int iTextLen = ::WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)lpwcszWString, -1, NULL, 0, NULL, NULL);
                pElementText 
            = new char[iTextLen + 1];
                memset((
            void*)pElementText, 0, (iTextLen + 1* sizeof(char));
                ::WideCharToMultiByte(CP_UTF8, 
            0, (LPWSTR)lpwcszWString, -1, pElementText, iTextLen, NULL, NULL);
                std::
            string strReturn(pElementText);
                delete [] pElementText;
                
            return strReturn;
            }

            posted @ 2013-03-13 11:32 Jacc.Kim 閱讀(4826) | 評論 (0)編輯 收藏

            僅列出標題
            共14頁: 1 2 3 4 5 6 7 8 9 Last 
            久久涩综合| 精品水蜜桃久久久久久久| 久久久久亚洲AV成人网| 久久久91精品国产一区二区三区| 精品久久久久久无码专区| 色欲av伊人久久大香线蕉影院| 久久亚洲中文字幕精品有坂深雪| 伊人久久大香线焦综合四虎| 中文字幕无码久久久| 久久亚洲欧美国产精品| 久久国产精品免费| 午夜天堂av天堂久久久| 亚洲国产天堂久久综合网站| 一本色综合久久| 欧美777精品久久久久网| 久久精品人妻中文系列| 国产精品青草久久久久福利99| 久久91精品国产91| 欧美日韩中文字幕久久伊人| 伊人久久大香线蕉综合网站| 国产精品成人无码久久久久久| 亚洲AV日韩精品久久久久久| 日本久久久久久中文字幕| 久久伊人中文无码| 国产精久久一区二区三区| 久久久久青草线蕉综合超碰 | 欧美丰满熟妇BBB久久久| 久久精品中文字幕第23页| 久久99精品久久久久久hb无码 | 国内精品久久久久久久亚洲| 无码人妻久久久一区二区三区| 亚洲精品tv久久久久| 久久久精品国产亚洲成人满18免费网站 | 国内精品久久久久久中文字幕| 久久久久成人精品无码中文字幕| 亚洲精品第一综合99久久| 亚洲欧美国产精品专区久久| 久久久无码精品亚洲日韩软件| segui久久国产精品| 国产伊人久久| 久久涩综合|