作者:
江南白衣 《Modern C++ Design》里的Policy-Base Class是Cpper得意的一樣事情;
Spring 式IoC container 的依賴注入是Javaer得意的一樣事情;
Ruby的Mixin特性是Rubyer得意的一樣事情。
有趣的是,各自得意的事情,指向的是同一個問題:多重行為的組合。
1 .Policy-Base是混合使用模板與C++的多重繼承達成的:
最終類多重繼承模版類,由模版傳入實際的行為類(Policy Class)。
template <class CheckingPolicy>
class SmartPtr : public CheckingPolicy
{...};
typedef SmartPtr<NoChecking> noCheckPtr;
上段代碼,在編譯期把NoChecking類傳入到SmartPtr中,組合成noCheckPtr類。而實戰中,還會用到"template template parameter"....
2 .Java則緊守最古老的委托模式來達成:
最終類擁有實際施行各種行為的行為類的指針。所有最終類的方法都將委托給行為類來執行。如果行為多樣時,采用基于接口編程。同時利用Java的反射特質,用IOC Container根據配置實現注入的自動化。
3. Ruby則倚仗自己的動態特性,直接在語言中內建了Mixin特性。
module Greetable
def greet
puts "Your age is, " + self.age
end
end
class Person
include Greetable
def initialize(name, age)
@name=name
@age=age
end
attr_reader :age
end
person=Person.new("Bruce",40)
person.greet
Your age is 40.
此段代碼將Greetable類Minxin進了Person類里頭,讓其擁有了greet方法。
也多虧了Ruby的動態性,讓Greetable可以打印一個自身毫不知情的,其實屬于Person的屬性age.
就因為同一樣事情還有著C++模板、傳統Delegate和新興動態Minxin的選擇,讓我們這些工蟻,還覺得有些許的自由和左顧右盼的樂趣。