因為簡書字數(shù)限制,完整版地址:https://www.zybuluo.com/hainingwyx/note/609905
如有錯誤,煩請指正!
第11章 對象數(shù)組
11.1 如何把對象串接成數(shù)組
串接:使用方括號[]把已有的變量組合起來,使其成為一個數(shù)組。使用這種方式構(gòu)造的對象數(shù)組,適用于對象數(shù)量比較少的情況。對objArray中對象元素的訪問和普通數(shù)組中元素的訪問是一樣的。在此基礎(chǔ)上使用點+屬性名稱的語法,可以訪問對象元素的屬性。
objArray=[b1 b2 b3];
objArray(1).a=10;
11.2 如何直接聲明對象數(shù)組
自動生成一個1*10的數(shù)組,并把第10個元素置為1,其余為沒有被賦予初值的元素,用0作為其初值。
array(1,10)=1;
對象擴展:objArray(1,10)=Square(5);
MATLAB解釋器會把這個命令翻譯成如下指令:對第10個元素調(diào)用Square(5);其余的1-9個元素調(diào)用缺省的構(gòu)造函數(shù)。缺省的構(gòu)造函數(shù)只被調(diào)用一次,產(chǎn)生了一個對象,其余的都是直接拷貝對象。調(diào)用缺省的構(gòu)造函數(shù)說明函數(shù)要考慮輸入0參數(shù)的情況。在此擴展的對象數(shù)組是handle類的,盡管其內(nèi)部數(shù)據(jù)的數(shù)值相同,但如果直接比較被拷貝的元素,它們的handle仍然是不同的。
注意Value類對象沒有定義==運算符,所以為了比較兩個對象,需要重載==(eq)運算符。
11.3 如何使用findobj尋找特定的對象
首先使用串接語法,構(gòu)造一個對象數(shù)組。然后使用邏輯‘-and’或者‘-or’關(guān)鍵詞,在findobj函數(shù)中查找指定對象。
11.4 如何利用Cellarray把不同類的對象組合到一起
MATLAB規(guī)定對象數(shù)組中元素的種類必須保持一致,如果不一致,matlab就會嘗試把一個對象轉(zhuǎn)換成另一個,如果找不到可以使用的對象轉(zhuǎn)換函數(shù),MATLAB就會報錯。最簡單的解決辦法就是使用元胞數(shù)組(Cell Array),元胞數(shù)組是MATLAB中專門用來存放不同種類數(shù)據(jù)的工具。例如:
o1=Square();
o2=Circle();
oCell={o1,o2}
oCell{1}.a%訪問CellArray中的一個元素
使用Cell取代array,簡單實用,但是沒有辦法利用向量化式地方式集中訪問數(shù)組中對象內(nèi)部的元素。
11.5 什么是轉(zhuǎn)換函數(shù)
定義:一種負責(zé)把該類的對象轉(zhuǎn)換成其他類的對象的一種類的方法。
只需要在該類中定義轉(zhuǎn)換函數(shù),則調(diào)用的時候就能完成轉(zhuǎn)換。轉(zhuǎn)換函數(shù)只需要調(diào)用轉(zhuǎn)換對象的Constructor。
11.6 如何利用轉(zhuǎn)換函數(shù)把不同類的對象組合到一起
轉(zhuǎn)換函數(shù)一般是隱式轉(zhuǎn)換。假設(shè)數(shù)組的第一個為Square對象,則第二個賦值時需要檢查,如果不相同,則需調(diào)用第二個對象的轉(zhuǎn)換函數(shù)。如果沒有定義轉(zhuǎn)換函數(shù),MATLAB會直接把第二個對象作為參數(shù)提供給square的構(gòu)造函數(shù)。如果無法處理,MATLAB會報錯。
11.7 如何用非同類(Heterogeneous)數(shù)組盛放不同類對象
11.7.1 為什么需要Heterogeneous數(shù)組
轉(zhuǎn)換函數(shù)把不同類型的對象組合到一起,并且不改變對象的類型。
使用Heterogeneous需要兩個類具有共同的父類,并且父類繼承自一個叫做Heterogeneous的基類。
基類聲明:
classdef Shape2D<handle&matlab.mixin. Heterogeneous
end
優(yōu)點:
- 不用定義convert函數(shù),不存在對象之間的相互轉(zhuǎn)換;
- 構(gòu)造出的數(shù)組可以存放共同基類的對象;
- 可以使用數(shù)組的下標語法,向量化訪問對象的共同特征;
- 可以使用對象的共同方法,必須是Sealed。
11.7.2 含有不同類對象的數(shù)組類型
包含有不同對象的數(shù)組類型,總是取對象們最近的共同父類。
11.7.3 使用Heterogeneous要避免哪些情況
1、沒有除Heterogeneous之外的共同的父類。
2、多重繼承存在交叉繼承,這時候也不能將子類的對象放到一個對象數(shù)組中去。
11.7.4 如何向量化遍歷數(shù)組中對象的屬性
如果用Dot語法訪問數(shù)組中對象的共同屬性,返回的結(jié)果將是一個用都好分隔的list。
11.7.5 如何設(shè)計成員方法使其支持向量化遍歷
s=objArray.area
objArray被當(dāng)做一個參數(shù)傳入area方法中。
如果是HeterogeneousArray,想要支持向量化訪問的成員方法,必須將其聲明成sealed,禁止子類中有不一致的定義。
對象數(shù)組是否可以向量化調(diào)用destructor?
destructor禁止定義成Sealed,否則子類資源可能無法釋放。但是MATLAB對delete方法仍支持使用objArray.delete的格式調(diào)用對象們的析構(gòu)函數(shù)。MATLAB并沒有向量化地調(diào)用對象們的析構(gòu)函數(shù),因為根本不存在這樣一個共同的delete方法。objArray.delete這里為:逐個調(diào)用每個對象的析構(gòu)函數(shù)。
第12章 類的運算符重載
12.1 理解MATLAB的subsref和subsasgn函數(shù)
12.1.1 MATLAB如何處理形如a(1,:)的表達式
A(1:2,:)會被MATLAB解釋器轉(zhuǎn)換成一個subsref的函數(shù)調(diào)用。該函數(shù)的第一個參數(shù)是要訪問的數(shù)據(jù)A;第二個參數(shù)是要訪問元素所在的位置,并且該位置信息存放在一個結(jié)構(gòu)體中。subsref(A,s);例如A(1:2,:),這里s.type=’()’;s.subs={1:2,’:’};也可以通過以下方法訪問數(shù)組元素:
s.type=’()’;
s.subs={1:2,’:’};
subsref(A,s);
對數(shù)組元素的賦值會被Interpreter轉(zhuǎn)換成一個subsasgn的函數(shù)調(diào)用,例如:
A(1,1)=0;被轉(zhuǎn)換成subsasgn(A,s,0),其中s是一個結(jié)構(gòu)體,
可以通過以下實現(xiàn)A(1,1)=0:
s.type=’()’;
s.subs={1,1};
subsasgn(A,s,0);
12.1.2 MATLAB如何處理形如a{1,:}的表達式
對元胞數(shù)組B第一列的訪問B{:,1}將會被Interpreter轉(zhuǎn)換成如下的subsref函數(shù)調(diào)用:
s.type=’{}’;
s.subs={‘:’,1};
subsref(B,s);
對元胞數(shù)組B的第一個元胞的賦值:
B{1,1}=0;將被MATLAB轉(zhuǎn)換成如下subsasgn函數(shù)調(diào)用。
s.type=’{}’;
s.subs={1,1};
subsasgn(B,s,0);
12.1.3 MATLAB如何處理形如s.f的表達式
對struct的訪問和賦值也可以直接通過直接調(diào)用內(nèi)置函數(shù)來完成。
days.f1和以下等價
s.type=’.’;
s.subs={‘f1’};
subsref(days,s);
days.f3=’NULL’ 和以下等價
s.type=’.’;
s.subs={‘f3’};
subsref(days,s,‘NULL’);
12.2 如何重載subsref函數(shù)
數(shù)組、矩陣、元胞數(shù)組、對象都支持上面的等價調(diào)用。形如subsref(obj,s)的調(diào)用,優(yōu)先調(diào)用用戶自定義的方法。
12.3 如何重載subsasgn函數(shù)
優(yōu)先調(diào)用用戶自定義的方法。
重載的時候需要返回obj.matrix和obj.cell因為該重載函數(shù)的任務(wù)是修改對象的屬性,但是obj.matrix和obj.cell不是handle對象,所以在函數(shù)內(nèi)部的修改僅僅是局部修改,必須將它傳回來。
重載subsasgn和subsref,將會重載該類的屬性訪問權(quán)限,使用時要慎重。
12.4 什么情況下重載下標運算符
- 當(dāng)用戶想完全禁止通過dot來訪問對象內(nèi)部屬性時,可以重載subsref函數(shù)。
- 當(dāng)用戶想構(gòu)造一個對象,使其行為看上去像函數(shù) 一樣,可以重載subsref函數(shù)。
- 當(dāng)用戶想在賦值對象數(shù)組時,做更多的檢查和限制,可以重載subsasgn函數(shù)。
- 讓一個標量對象行為像矢量一樣。
注意:使用自定義的下標運算符取代內(nèi)置定義的下邊運算符應(yīng)當(dāng)是一個方便編程的手段,不應(yīng)該使用在對性能要求很高的程序中。
12.5 如何重載plus函數(shù)
MATLAB中+默認是做算數(shù)運算,所以在內(nèi)部會把string轉(zhuǎn)換成數(shù)字,調(diào)用plus函數(shù)。
12.6 MATLAB的Dispatching規(guī)則是什么
對于形如obj.foo(arg1,arg2,arg3)的調(diào)用,Dispatcher會直接檢查obj類定義中是否定義了foo的方法,如果定義了,那就調(diào)用;沒有定義,報錯。
形如foo (obj,arg1,arg2,arg3),Dispatcher不會首先檢查obj類定義中是否定義了foo的方法,而是首先檢查四個參數(shù)obj,arg1,arg2,arg3哪個參數(shù)所屬的類是更高級別的類,即為dominant類,然后查找dominant類中是否定義了foo方法,如果定義就調(diào)用;沒有定義,報錯。
類的級別:任何用戶定義的類,級別高于MATLAB內(nèi)置的類。
指定用戶定義的類之間的級別
classdef (InferiorClasses={?A,?B})C
end
C的級別比A和B的高,如果這三類出現(xiàn)在參數(shù)列表中,C的對象是dominant對象。
12.7 如何判斷兩個對象是否相同
handle對象,==運算時在handle中就定義好的算法,用于檢查handle類所指向的實際數(shù)據(jù)時同一個。handle對象的拷貝是淺拷貝,只復(fù)制了類中的地址,沒有復(fù)制類中實際指向的數(shù)據(jù)對象。
Value類數(shù)據(jù),沒有定義‘==’運算符,需要用戶自己指定行為。
12.8 如何讓一個對象在行為上像一個函數(shù)
仿函數(shù):使普通函數(shù)具有類的功能。
12.9 MATLAB中哪些算符允許重載
第13章 超類
13.1 什么是超類(MetaClass)
定義:用一種普遍的方式來描述類,即用類的方式來描述類。
13.2 如何獲得一個類的meta.class對象
第一種得到meta對象的方法是:已知類的名字,可以在類名前面加上一個問號來獲得meta.class例如:metaObj=?FileIterator。
第二種方法是:如果有了一個類的對象,可以用meta.class函數(shù)來獲得meta.class對象,如:metaObj=metaclass(obj);
第三種方法最靈活:如果類的名字是以字符串的形式存在的,可以利用meta.class類中的成員方法fromName,該函數(shù)接受string input,返回meta.class對象,例如:name=’Vehicle’;metaObj=meta.class.fromName(name);
13.3 meta.class對象中有些什么內(nèi)容
如何系統(tǒng)地獲得類中所有property的名字?
metaobj=?Derived;
propNameList={metaobj.PropertyList.Name}
- metaobj.PropertyList是一個對象數(shù)組,其中的內(nèi)容是meta.property的對象
- 使用.語法可以向量化訪問數(shù)組中對象的共同屬性
- metaobj.PropertyList.Name返回的結(jié)果是string類型,由于string的長度不同,使用{}把返回的結(jié)果收集到元胞數(shù)組中去。
13.4 如何手動克隆一個對象
- handle類的淺拷貝
對象的屬性相互關(guān)聯(lián),不獨立,俗稱淺拷貝。 - 簡單克隆
優(yōu)點:實現(xiàn)簡單。
缺點:如果要克隆有很多的屬性,那么一個一個鍵入屬性會很麻煩。
方法1:構(gòu)造一個方法,先在該方法中聲明一個新的對象,叫做newObj,再把舊的對象每一個屬性的值都復(fù)制到新的對象newObj中,最后在將該newObj返回。
方法2:用meta.class函數(shù),先獲得該類的metaObject,然后取出其中的propertyList中屬性的名字,然后遍歷賦值即可。
該方法中newobj.(props{j})=obj.(props{j})有一個隱藏的前提,所有的property都是Value類型的對象,如果有一個property是handle類型的,則得到的拷貝仍然是淺拷貝。 - 遞歸克隆
為了解決仍然是淺拷貝的問題,用戶需要提供兩個類的clone函數(shù)
classdef Ref<handle
properties
a
bobj
end
methods
function obj=Ref()
obj.a=rand(1);
obj.bobj=BHandle;
end
function newobj=clone(obj)
newobj=Ref();
metaobj=metaclass(obj);%得到meta Object
props={metaobj.PropertyList.Name};%得到props名字
for j=1:length(props)
tmpProp=obj.(props{j});
if(isa(tmpProp,'handle'))%調(diào)用該類的Prop方法
newobj.(props{j})=tmpProp.clone();
else
newobj.(props{j})=tmpProp;
end
end
end
end
end
Bhandle:
classdef BHandle<handle
properties
var
end
methods
function obj=BHandle()
obj.var=rand(1);
end
function newobj=clone(obj)
newobj=BHandle();
metaobj=metaclass(obj);%得到meta Object
props={metaobj.PropertyList.Name};%得到props名字
for j=1:length(props)
tmpProp=obj.(props{j});
if(isa(tmpProp,'handle'))
newobj.(props{j})=tmpProp.clone();%程序不會運行到這里
else
newobj.(props{j})=tmpProp;
end
end
end
end
end
13.5 如何使用matlab.mixin.Copyable自動克隆一個對象
MATLAB提供mixin類的Copyable,其中包括copy和copyElement兩個方法幫助用戶完成基本的handle類對象的深拷貝。copy方法是sealed,不允許子類重載,copyElement是protected,允許子類重載。用戶只需要讓自己的類繼承自matlab.mixin.Copyable即可,此時仍為handle類。和前面類似,copy和copyElement組合在一起也是自動遍歷的對象中的各個屬性做拷貝。
clear all;clc;
record1=StudentRecord();
record1.name='A';
record2=copy(record1);
record2.name='B';
record1.name
record2.name
copyable類中的方法默認的并不包括對屬性做遞歸的深拷貝,如果對象有一個handle對象,使用copy方法進行對象拷貝時,該對象被淺拷貝。
用戶可以重載copyElement方法。先在copyElement中調(diào)用父類的copyElement方法,得到新的StudentRecord對象,這時homework屬性是淺拷貝。然后對其中的homework屬性做完全的復(fù)制。
第14章 面向?qū)ο蟪绦蛟O(shè)計的基本思想
14.1 單一職責(zé)原則
一個類最好只有一個引起它變化的因素。
UML,實心菱形表示非包括不可的組合關(guān)系;空心菱形表示松散的可有可無的組合關(guān)系,也叫聚集。
14.2 開放與封閉原則
程序的設(shè)計應(yīng)該對修改是封閉的,對擴展是開放的。
14.3 多用組合少用繼承
使用組合可以讓系統(tǒng)有更大的彈性,不僅可以將算法封裝成類,還可以在運行時動態(tài)地改變對象的行為。
14.4 面向接口編程
上層模塊通常是包含抽象方法的抽象類,而繼承他們的子類要提供這些方法的實現(xiàn)。通常這些子類叫做對接口的實現(xiàn)。
第15章 創(chuàng)建型模式
15.1工廠模式:構(gòu)造不同種類的面條
15.1.1簡單工廠模式
簡單工廠模式:對象的產(chǎn)生細節(jié)由一個特定的類負責(zé),并且該類中包含了必要的邏輯判斷以產(chǎn)生不同的對象。
15.1.2工廠模式
工廠模式的關(guān)鍵在于具體的對象的創(chuàng)建時機推遲到工廠子類中完成。不希望高層的模塊和具體的硬件細節(jié)打交道,所以把產(chǎn)生這個對象的工作交給工廠模式去完成。
15.1.3Factory模式總結(jié)
定義一個創(chuàng)建對象的接口,讓子類決定實例化哪個類。factory模式使一個類的實例化延遲到其子類。
15.1.4如何進一步去掉switch/if語句
對于缺省的Constructor可以:
function obj=createObj(classname)
obj=eval(classname);
end
test:createObj(‘Sub1’);
否則對于如下的Constructor:
classdef Sub1<handle
properties
a
end
methods
function obi=Sub1(var)
obj.a=var;
end
end
end
可以使用strcat構(gòu)造要執(zhí)行的命令的字符,然后再用eval函數(shù)執(zhí)行命令。
test:
classname=’Sub1’;
cmd=strcat(classname,’(’,’10’,’)’);
obj=eval(cmd);
或者使用str2func函數(shù),從classname處獲得類的構(gòu)造函數(shù)的句柄,然后像正常使用構(gòu)造函數(shù)那樣調(diào)用該函數(shù)句柄。
classname=’Sub1’;
ConstructHandle=str2func(classname);
obj=ConstructHandle(3);
15.1.5 抽象工廠
最后的產(chǎn)品是各種面條的聚集。
15.1.6 AbstractFactory模式總結(jié)
提供一個創(chuàng)建一系列相關(guān)或者相互依賴的對象的接口,而無需指定它們具體的類。
-
模式結(jié)構(gòu)
類之間的協(xié)作
在運行時,client將負責(zé)創(chuàng)建一個ConcreteFactory類的實例,這個具體的工廠具有創(chuàng)建不同對象的代碼。Client可以更換具體的工廠以得到不同的具體的產(chǎn)品。何時使用AbstractFactory模式
當(dāng)一個系統(tǒng)要獨立于它的產(chǎn)品創(chuàng)建、組合、表示時。
當(dāng)一個系統(tǒng)需要多個產(chǎn)品系列中的一個來配置時。
當(dāng)需要強調(diào)一系列相關(guān)產(chǎn)品的設(shè)計時,以便進行聯(lián)合調(diào)用。
15.2 單例模式:給工程計算添加一個LOG文件
15.2.1 如何控制對象的數(shù)量
MATLAB工程科學(xué)計算時,在過程中輸出一些結(jié)果,用來調(diào)試程序。一般記錄中間結(jié)果的文件叫做LOG。在程序運行期間,都能往LOG中寫入數(shù)據(jù),并且程序運行期間有且只有一個LOG。
單例Singleton模式:該模式用來控制一個類所產(chǎn)生的對象的數(shù)量。
classdef MyClass<handle
methods(Access=private)%私有構(gòu)造函數(shù)
function obj=MyClass()
disp('constructor called');
end
end
methods(Static)
function obj=getInstance()%靜態(tài)接口方法
persistent localObj
if isempty(localObj)||~isvalid(localObj)%如果localObj不存在則創(chuàng)建
localObj=MyClass();
end
obj=localObj;%如果localObj已存在則返回
end
end
end
obj1=MyClass.getInstance();
obj2=MyClass.getInstance();
obj3=MyClass.getInstance();
這是一個Handle類,所以構(gòu)造出來的obj1,obj2,obj3實際指向同一個實例。
15.2.2 應(yīng)用:如何包裝一個對象供全局使用
classdef LogClass<handle
properties
FID
end
methods(Access=private)%私有構(gòu)造函數(shù)
function obj=LogClass()%打開文件
obj.FID=fopen('logfile.txt','a');
end
end
methods
function delete(obj)%關(guān)閉文件
fclose(obj.FID);
end
function print(obj,string)
fprintf(obj.FID,string);
end
end
methods(Static)%控制外部訪問
function obj=getInstance()%靜態(tài)接口方法
persistent localObj
if isempty(localObj)||~isvalid(localObj)%如果localObj不存在則創(chuàng)建
localObj=LogClass();
end
obj=localObj;%如果localObj已存在則返回
end
end
end
15.3 建造者模式:如何用MATLAB構(gòu)造一輛自行車
15.3.1 問題的提出
15.3.2 應(yīng)用:Builder模式為大規(guī)模計算做準備工作
15.3.3Builder模式總結(jié)
將一個復(fù)雜對象的構(gòu)建與它的表示方法分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
- Builder模式結(jié)構(gòu)
Director、Builder、ConcreteBuilder、Product、Part
- 類之間的協(xié)作
- Client(外部程序)負責(zé)構(gòu)造Director對象,并且設(shè)定該Director所要指導(dǎo)的具體Builder。
- Director擁有Builder對象,并且可以替換。
- Builder擁有product對象,Product對象由parts對象組成
- 構(gòu)造產(chǎn)品的請求發(fā)自于Director,Builder接到請求之后按照Director所指導(dǎo)的順序把parts對象添加到產(chǎn)品中去
- 何時使用Builder
- 當(dāng)構(gòu)造過程中允許被構(gòu)造的對象有不同的表示時。
- 當(dāng)創(chuàng)建復(fù)雜對象的算法,要獨立于該地對象的裝配方式時。
第16章 構(gòu)造型模式
16.1 裝飾者模式:動態(tài)地給對象添加額外的職責(zé)
16.1.1 裝飾者模式的引入
16.1.2 面館菜單代碼
這種設(shè)計對修改是封閉的,還支持多次裝飾,對擴展是開放的。
16.1.3 裝飾者模式總結(jié)
動態(tài)地給對象添加一些額外的職責(zé),就增加功能來說,Decorator模式相比生成子類更為靈活,Decorator模式也叫做包裝器。
-
裝飾者模式結(jié)構(gòu)
Component、ConcreteComp1、ConcreteComp2、Decorator、ConcreteDeco1、ConcreteDeco2
類之間的協(xié)作
Concrete Component和Concrete Decorator都有相同的基類,并且Decorator基類中的compHandle被用來指向何時使用Decorator模式
Decorator模式可以避免通過創(chuàng)建子類來擴展類的功能,Decorator是以動態(tài)的方式給單個對象添加新的功能。想要擴展類,又想避免子類數(shù)量爆炸時,可以考慮使用Decorator模式。
第17章 行為模式
17.1 觀察者模式:用MATLAB實現(xiàn)觀察者模式
17.1.1 發(fā)布和訂閱的基本模型
17.1.2 訂閱者查詢發(fā)布者的狀態(tài)
17.1.3 把發(fā)布者和訂閱者抽象出來
17.1.4 Observer模式總結(jié)
定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知,并且自動被更新。
-
模式結(jié)構(gòu)
Subject、ConcreteSubject、Observer、ConcreteObserver
類之間的協(xié)作
- 具體的觀察者向ConcreteSubject對象發(fā)出訂閱的請求,該ConcreteSubject對象把具體觀察者加到其內(nèi)部的一個列表中。
- 當(dāng)ConcreteSubject內(nèi)部發(fā)生改變,需要通知其觀察者時,它將遍歷其內(nèi)部的觀察者的列表,依次調(diào)用這些觀察者的update方法。
- 觀察者得到更新的通知,它可以向ConcreteSubject對象提出查詢請求。
17.2 策略模式:分離圖像數(shù)據(jù)和圖像處理算法
17.2.1 問題的提出
17.2.2 應(yīng)用:更復(fù)雜的分離數(shù)據(jù)和算法的例子
17.2.3 Strategy模式總結(jié)
- 模式結(jié)構(gòu)
Context、Strategy、StrategyA、StrategyB、StrategyC
- 類之間的協(xié)作
- 在Context對象中存放數(shù)據(jù),而Strategy對象中存放算法,Context對象可以選擇所需要的算法。
- Context對象把來自外界的計算請求轉(zhuǎn)交給Strategy對象。
- 轉(zhuǎn)交請求是,Context把自己作為一個參數(shù)傳遞給Strategy對象,以提供Strategy對象計算所需要的數(shù)據(jù)。
- Strategy模式何時使用
Strategy模式是用來封裝算法的,在實踐中,可以用來封裝幾乎任何類型的規(guī)則。如果在分析過程中,需要在不同的情況下應(yīng)用不同的算法,就可以考慮使用Strategy模式來處理問題。
17.3 遍歷者模式:工程科學(xué)計算中如何遍歷大量數(shù)據(jù)
17.3.1 問題的提出
files=dir(c:\datafolder);
files=files(cell2mat({files(:).isdir})~=1);%去除文件夾中的目錄
for i=1:length(files)
inputname=file(i).name;
imgObj=Image(inputname);
imgObj.doMethod();
end
17.3.2 聚集(Aggregator)和遍歷者(Iterator)
17.3.3 Iterator模式總結(jié)
Iterator(內(nèi)部)的意圖是用一種方法順序去訪問一個聚集對象中的各個元素,而又不用暴露對象的內(nèi)部顯示。
- Iterator模式結(jié)構(gòu)
Aggregator、ConcreteAggregator1、ConcreteAggregator2、Iterator、ConcreteIterator1、ConcreteIterator2
- 類之間的協(xié)作
- 因為遍歷的方式和Aggregator自身的內(nèi)部情況有關(guān)。只有Aggregator才有足夠的信息來告訴外部類該如何遍歷自己,所以具體的Aggregator負責(zé)產(chǎn)生具體的Iterator。
- 具體的Iterator類將擁有Aggregator的Handle用來從集合中取元素
- 兩個Base類用來提供接口,規(guī)定具體的Aggregator和具體的Iterator應(yīng)該提供何種方法,以及方法的signature應(yīng)該是怎么樣的
- ConcreteIterator提供不同的遍歷方式,比如ConcreteIterator1提供從前往后的遍歷,而第二個則是隨機遍歷。
17.4 狀態(tài)模式:用MATLAB模擬自動販賣機
17.4.1 使用if語句的自動販賣機
17.4.2 使用StatePattern的自動販賣機
17.4.3 State模式總結(jié)
狀態(tài)模式:允許對象修改內(nèi)部狀態(tài)是改變它的行為,對象看起來好像是修改了它的類。
-
State模式的結(jié)構(gòu)
Context、State、ConcreteState1、ConcreteState2
類之間的協(xié)作
對于來自外界的和自身狀態(tài)相關(guān)的請求,Context對象將這些請求委托給ConcreteState對象處理。
ConcreteStata對象可以訪問Context對象,也可以改變Context對象的內(nèi)部狀態(tài)。這就要求:在request方法中,Context對象必須把自己作為一個參數(shù)傳遞給ConcreteState對象。
使用Context類的client不需要和State的對象打交道。何時使用State模式
- 當(dāng)對象的行為取決于它的狀態(tài),并且該對象在運行時會改變狀態(tài)。也就是說對象的行為會在運行時改變,可以考慮使用State模式。
- 當(dāng)一個操作中含有龐大的多分支條件語句,而且這些分支語句依賴于對象的狀態(tài)時,可以考慮使用State模式將每個條件分支放入一個獨立的類中,而對象的狀態(tài)對應(yīng)于擁有一個狀態(tài)類對象。
17.5 模板模式:下面條和煮水餃有什么共同之處
17.5.1 抽象下面條和煮水餃的過程
17.5.2 應(yīng)用:把策略和模板模式結(jié)合起來
17.5.3 Template模式總結(jié)
模板方法模式:定義一個操作中的算法的骨架,將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可以重新定義該算法的某些特殊的步驟。
- Template模式的結(jié)構(gòu)
AbstractClass、ConcreteClass1、ConcreteClass2。Template模式中,含有反向控制的結(jié)構(gòu),因為通常是子類調(diào)用父類的操作,而在這個模式里,卻是父類調(diào)用子類。這種結(jié)構(gòu)也被叫做好萊塢模式。
17.6 備忘錄模式:實現(xiàn)GUI的UNDO功能
17.6.1如何記錄對象的內(nèi)部狀態(tài)
Map:http://blog.sina.com.cn/s/blog_6163bdeb0100rdx3.html
http://blog.sina.com.cn/s/blog_4a0824490102vamk.html
17.6.2如何利用備忘錄模式實現(xiàn)GUI的do和undo操作
17.6.3Memento模式總結(jié)
在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣,以后可以將該對象復(fù)原到原先的狀態(tài)。
-
memento模式結(jié)構(gòu)
- 類之間的協(xié)作
- Originator是擁有狀態(tài)的對象,外部的命令向originator發(fā)出一個請求,要求保存?zhèn)渫洝?/li>
- originator把自身狀態(tài)數(shù)據(jù)封裝到一個memento對象中,并且提交給caretaker保存。
- 只有Originator知道該如何利用Memento對象中的數(shù)據(jù),Caretaker的工作僅僅是保存各個Memento對象,不能對備忘錄的內(nèi)容進行操作。