摘要:前言最近在看設(shè)計模式。類抽象類中接口圖示接口在中的圖形為可以看到再其上半部分有一個的表示。代碼在中本事是沒有接口和抽象類這一概念的,但是可以通過這個庫來實(shí)現(xiàn)。在代碼中的結(jié)構(gòu)就是繼承非抽象類。箭頭指向抽象類。
前言
最近在看設(shè)計模式。在學(xué)習(xí)初期一直有一個問題困擾著我,那就是UML類圖
中的各種結(jié)構(gòu)用python代碼是如何實(shí)現(xiàn)的?這個在初期可以說是深深的困擾著我的設(shè)計模式
學(xué)習(xí)之路。下面我將介紹一下我自己總結(jié)的實(shí)現(xiàn),如果有錯誤也希望各位給指出,不勝感激。
本文的UML圖采用Enterprise Architect繪制。
Python版本2.7.12
(在用了Enterprise Architect 后才知道他有從類圖導(dǎo)出代碼的功能,/捂臉
早知道就用這個學(xué)習(xí)各種結(jié)構(gòu)的實(shí)現(xiàn)了。文末有介紹如何用Enterprise Architect 導(dǎo)出代碼。)
類圖是由類和類之間的連接關(guān)系構(gòu)成。
類我們這里只介紹類和抽象類。
連接關(guān)系我們介紹泛化(generalization)、實(shí)現(xiàn)(realize)、聚合(aggregation)、組合(compositon)、關(guān)聯(lián)(assocation)和依賴(dependency)共六種。
接口在UML中的圖形為
可以看到再其上半部分有一個interface的表示。在接口中一般只給出接口的定義
而實(shí)現(xiàn)一般放在子類和實(shí)現(xiàn)。
在python中本事是沒有接口和抽象類這一概念的,但是可以通過abc(Abstract Base Class)這個python庫來實(shí)現(xiàn)。或者是通過拋出NotImplementedError這個異常來實(shí)現(xiàn)。
通過abc模塊來實(shí)現(xiàn)from abc import ABCMeta, abstractmethod, abstractproperty class Drawable: __metaclass__ = ABCMeta @abstractproperty def size(self): pass @abstractmethod def draw(self, x, y, scale=1.0): pass class Cicle(Drawable): def size(self): print "Cicle" def draw(self, x, y, scale=1.0): print str(x*y*scale) c = Cicle()
如果在子類里面沒有實(shí)現(xiàn)方法,當(dāng)實(shí)例化子類的時候會報錯。abc模塊的具體使用這里就不介紹了。放上abc的 PEP3119
通過拋異常來實(shí)現(xiàn)class Drawable1: def size(self): raise NotImplementedError def draw(self, x, y, scale=1.0): raise NotImplementedError class Cicle(Drawable): def size(self): print "Cicle" def draw(self, x, y, scale=1.0): print str(x*y*scale) c = Cicle() c.draw()
這里如果子類沒有實(shí)現(xiàn)方法,在實(shí)例化的時候不會報錯。只有當(dāng)調(diào)用到未實(shí)現(xiàn)的方法時候才會報錯。這種通過abc的注冊機(jī)制也可以實(shí)現(xiàn)。
類 圖示類的圖示如下
可以看到整個圖形分為三部分:上面為類名,中間為類屬性,下面為類方法。
其中可以看到有- + 和# 三種符號,其分別代表私有、公有、保護(hù)。其中保護(hù)變量在python中是不存在的。
公有變量可以在類外被直接訪問。且可以被子類繼承,私有變量只能再此類中被訪問且不可以被子類繼承。
class Flower(object): def __init__(self, floral=None, leaf=None): self.floral = floral self.__leaf = leaf def flowing(self): print "flower" def __grow(self): print "grow grow"
其中以兩條下劃線開頭的變量為私有變量,方法為私有方法。
其實(shí)在python中也不是在類外面無法訪問到私有變量或方法。只是在生成python字節(jié)碼的時候在編譯器自動再含有__ 開頭的屬性或變量前加上了 _{classname}了你可以在類外通過 _Flower__leaf 訪問到__leaf屬性,當(dāng)然這并沒有什么意義。
首先我們來看一下泛化關(guān)系的UML結(jié)構(gòu)圖。
連接器的是由一條直線和一個三角組成的,連接的兩端都是類。在代碼中的結(jié)構(gòu)就是繼承非抽象類。
代碼class Car(object): def __init__(self): self.wheel = ["11", "12", "21", "22"] self.body = "car body" def run(self): print self.wheel print self.body def horn(self): print "bbbbbbb" class SUV(Car): def run(self): print "suv" super(SUV, self).run() class Jeep(Car): def run(self): print "jeep" super(Jeep, self).run() jeep = Jeep() jeep.run() jeep.horn()
我們可以看到Jeep和SUV繼承了Car這個非抽象類
實(shí)現(xiàn)(realize) 圖示從圖中可以看出實(shí)現(xiàn)關(guān)系為一個三角箭頭加一段虛線構(gòu)成。箭頭指向抽象類。
在代碼中表現(xiàn)為繼承抽象類。
class Vehicle(object): def run(self): raise NotImplementedError class Car(Vehicle): def run(self): print "car run run" class Bicycle(Vehicle): def run(self): print "bicycle run run"
代碼中Car和Bicycle繼承了Vehicle這個抽象類。
關(guān)聯(lián)關(guān)系(assocation)圖示關(guān)聯(lián)關(guān)系是用一條直線表示的;它描述不同類的對象之間的結(jié)構(gòu)關(guān)系;它是一種靜態(tài)關(guān)系, 通常與運(yùn)行狀態(tài)無關(guān),一般由常識等因素決定的;它一般用來定義對象之間靜態(tài)的、天然的結(jié)構(gòu); 所以,關(guān)聯(lián)關(guān)系是一種“強(qiáng)關(guān)聯(lián)”的關(guān)系;
比如,乘車人和車票之間就是一種關(guān)聯(lián)關(guān)系;學(xué)生和學(xué)校就是一種關(guān)聯(lián)關(guān)系;[1]
關(guān)聯(lián)關(guān)系為一條直線,可以有箭頭,如圖表示car知道Moter的存在而Moter不知道Car的存在。表現(xiàn)在代碼中就是Car中有一個屬性為Motor類的實(shí)例。也可以為雙箭頭表示互相知道。
代碼class Motor(object): pass class Car(object): def __init__(self): self.motor = Motor()依賴關(guān)系(dependency)
他描述一個對象在運(yùn)行期間會用到另一個對象的關(guān)系.與關(guān)聯(lián)關(guān)系不同的是,它是一種臨時性的關(guān)系,通常在運(yùn)行期間產(chǎn)生,并且隨著運(yùn)行時的變化; 依賴關(guān)系也可能發(fā)生變化;
顯然,依賴也有方向,雙向依賴是一種非常糟糕的結(jié)構(gòu),我們總是應(yīng)該保持單向依賴,杜絕雙向依賴的產(chǎn)生;
注:在最終代碼中,依賴關(guān)系體現(xiàn)為類構(gòu)造方法及類方法的傳入?yún)?shù),箭頭的指向為調(diào)用關(guān)系;依賴關(guān)系除了臨時知道對方外,還是“使用”對方的方法和屬性;[1]
從圖中可以看出依賴關(guān)系為在類的方法中將另一個類當(dāng)作參數(shù)傳入。
代碼class People(object): def cooking(self, wok): wok.cook() class Wok(object): def cook(self): print "cook"
我們在People的cooking方法中傳入了Wok實(shí)例,調(diào)用其cook方法,完成people的cooking動作。
組合關(guān)系(composition)組合關(guān)系表示整體由部分構(gòu)成,但是當(dāng)整體不存在時部分也不存在,是一種強(qiáng)依賴關(guān)系。
圖示從圖中看到組合關(guān)系是由一個實(shí)心的菱形箭頭表示,菱形箭頭指向整體。 公司由部分組成。當(dāng)公司不存在了,部門也就不存在了。
代碼class Company(object): def __init__(self): self.__departments = [] def build_department(self, department): self.__departments.append(department) class Department(object): def __init__(self, name): self.name = name c = Company() d1 = Department("1") d2 = Department("2") c.build_department(d1) c.build_department(d2)聚合關(guān)系(aggregation)
聚合關(guān)系表示整體由部分構(gòu)成但是當(dāng)整體不存在的時候部分也是可以存在的。
圖示從圖中看到聚合關(guān)系由一個空心的菱形箭頭表示, 菱形箭頭指向整體。及公司是由人組成的。 當(dāng)公司不存在的時候人還是可以多帶帶存在的。 組合關(guān)系和聚合關(guān)系由常識來區(qū)別的。在實(shí)現(xiàn)上區(qū)別不大。
代碼class Company(object): def __init__(self): self.__employees = [] def add_employee(self, people): self.__employees.append(people) class People(object): pass c = Company() p1 = People() p2 = People() p3 = People() c.add_employee(p1) c.add_employee(p2) c.add_employee(p3)如何從Enterprise Architect 導(dǎo)出代碼
有點(diǎn)長我把這個再寫一篇,
如何從Enterprise Architect 導(dǎo)出代碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/40951.html
摘要:借助,自動提取代碼的動態(tài)調(diào)用流程圖。繪制類圖安裝是一個開源圖形可視化軟件。循環(huán)曲線表示遞歸過程調(diào)用。繪制的常用工具有靜態(tài)調(diào)用圖等。包括模塊之間的調(diào)用流程函數(shù)調(diào)用次數(shù)及耗時等。 ...
摘要:本篇主要講述中使用函數(shù)來實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 《流暢的Python》筆記。本篇主要講述Python中使用函數(shù)來實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 1. 重構(gòu)策略模式 策略模式如果用面向?qū)ο蟮乃枷雭砗唵谓忉尩脑挘鋵?shí)就是多態(tài)。父類指向子類,根據(jù)子類對同一方法的不同重寫,得到不同結(jié)果。 1.1 經(jīng)典的策略模式 下圖是經(jīng)典的策略模式的U...
摘要:設(shè)計模式設(shè)計模式基本原則設(shè)計原則按接口而不是按實(shí)現(xiàn)來編程按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一個具體實(shí)現(xiàn)的實(shí)例。例如父類的一個改變會逐級向下傳遞給子類實(shí)現(xiàn),這可能會影響子類使用的某個算法。 設(shè)計模式 設(shè)計模式基本原則 設(shè)計原則 ① : 按接口而不是按實(shí)現(xiàn)來編程 按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一...
摘要:類之間的關(guān)系關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系是類與類之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一個類對象與另一個類對象之間有聯(lián)系。自關(guān)聯(lián)在系統(tǒng)中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關(guān)聯(lián)關(guān)系稱為自關(guān)聯(lián)。 UML UML:統(tǒng)一建模語言(Unified Modeling Language)。在 UML 系統(tǒng)開發(fā)中有三個主要的模型: 功能模型:從用戶的角度展示系統(tǒng)的功能,包括用例圖...
閱讀 2556·2021-09-22 15:25
閱讀 2963·2021-09-14 18:03
閱讀 1212·2021-09-09 09:33
閱讀 1700·2021-09-07 09:59
閱讀 2930·2021-07-29 13:50
閱讀 1500·2019-08-30 15:44
閱讀 1715·2019-08-29 16:22
閱讀 1287·2019-08-29 12:49