以前,我們在討論《業務分析三維度(場景+角色+時間)理論》 的軟體設計的時候,對於場景中的訪問者,動態附加場景許可的角色,如何通過訪問者執行角色方法的問題,採用了下面的實現方式:
actor.actas().function(para para);
這種方式本質上是將actor轉換成為了irole介面的例項物件,然後進行方法訪問的,但這樣就暴露了角色物件,比如可以這樣繼續使用:
irole role=actor.actas();role.fun1();
role.fun2(
"abc
");
這樣看起來的話,role 跟actor 是2個物件了,總覺得有點割裂。
今天,我們使用表示式樹,來實現乙個更優美的方案。
首先定義角色物件和訪問者物件的介面:
publicinte***ce
iactor
}public
inte***ce
irole
}
然後定義乙個動物角色介面,它擁有走路和吃東西的本能方法;
publicinte***ce
ianimal:irole
接著實現乙個動物角色類:
publicclass
animal : ianimal
#region ianimal 成員
public
void
move()
move...
",actor.name);
}public
int eat(string
food)
eat..
", actor.name, food);
return1;
}#endregion
}
在實際的角色物件中,它是可以訪問「訪問者」的方法的,比如這裡的actorname
下面,是我們的重點,actor 訪問者類的實現:
classactor:iactor
public actor(string
name)
public
void
addrole(irole role)
public tresule actas(expression> exp) where t : class
public t getobject() where t : class
return
null
; }
}
我們重點來看actas 方法,它將把自己轉換成指定的角色,然後呼叫角色的方法,但是引數是 expression> ,這就允許我們以非常友好的方式來編碼了,還是看看怎麼呼叫這個**:
actor man = new actor("zhagnsan");
man.addrole(
new animal());//
為張三新增動物的本能職責
var result=man.actasint>(a => a.eat("
rice
"));
console.writeline(
"result:
",result);
我們在方法裡面,用熟悉的方式,呼叫了動物角色的吃東西方法。
這裡是程式輸出:
zhagnsan eat.rice.result:
1
相比較文章開頭的方式, 這裡man.actas直接執行了角色物件的方法,而不給外部人員知曉zhangsan 擁有某個角色物件例項的機會,這樣就完成了訪問者對於自己角色更好的「封裝」。也就是,只有自己才可以執行自己角色的方法,這才是符合真實場景的設計。
-----------分界線------------------------
歡迎加入pdf.net開源技術團隊,做最好最輕最快的框架!
表示式 使用API建立表示式樹(5)
一 conditionalexpression 表示式 生成如 iif a b a和b相等 a與b不相等 式子。使用 parameterexpression aip1 expression.parameter typeof int a 1 parameterexpression aip2 expre...
表示式 使用API建立表示式樹(3)
一 debuginfoexpression 發出或清除除錯資訊的序列點。這允許偵錯程式在除錯時突出顯示正確的源 static void main string args 執行了下 未經處理的異常 system.reflection.targetinvocationexception 呼叫的目標發生了...
表示式 使用API建立表示式樹(2)
一 blockexpression類 表式乙個包含可在其中定義變數的表示式序列的塊。是一組表示式,類似於多個委託的 後的效果,其返回表示式是最後乙個表示式決定。以下是blockexpression的例子 取自官網中的例子,略改了下 宣告乙個包含有4個表示式的表示式塊。blockexpression ...