作者:江南白衣
《Modern C++ Design》里的Policy-Base Class是Cpper得意的一樣事情;
Spring 式IoC container 的依賴注入是Javaer得意的一樣事情;
Ruby的Mixin特性是Rubyer得意的一樣事情。
有趣的是,各自得意的事情,指向的是同一個問題:多重行為的組合。
1 .Policy-Base是混合使用模板與C++的多重繼承達成的:
最終類多重繼承模版類,由模版傳入實際的行為類(Policy Class)。
上段代碼,在編譯期把NoChecking類傳入到SmartPtr中,組合成noCheckPtr類。而實戰中,還會用到"template template parameter"....
2 .Java則緊守最古老的委托模式來達成:
最終類擁有實際施行各種行為的行為類的指針。所有最終類的方法都將委托給行為類來執行。如果行為多樣時,采用基于接口編程。同時利用Java的反射特質,用IOC Container根據配置實現注入的自動化。
3. Ruby則倚仗自己的動態特性,直接在語言中內建了Mixin特性。
此段代碼將Greetable類Minxin進了Person類里頭,讓其擁有了greet方法。
也多虧了Ruby的動態性,讓Greetable可以打印一個自身毫不知情的,其實屬于Person的屬性age.
就因為同一樣事情還有著C++模板、傳統Delegate和新興動態Minxin的選擇,讓我們這些工蟻,還覺得有些許的自由和左顧右盼的樂趣。
《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;
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.
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的選擇,讓我們這些工蟻,還覺得有些許的自由和左顧右盼的樂趣。
print person.age
什么都不用,person有age這個屬性自然就打出來,沒有就拋異常。
你說的只是動態性的入門功能。
另外那本<Beyond java> 講java aop的實現太生硬, 人家python,ruby沒有特別的aop工具,一樣能實現AOP的效果:)
c++ 是在編譯期實現的功能注入 , 還不夠靈活。在.net中框架把函數調用轉換為消息的傳遞,通過對消息的攔截來實現功能的注入。類的編寫者根本不需要關心被注入的功能。
[code]
import new
def greet(self):
print self.age
class Person(object):
def __init__(self):
self.age = 100
self.greet = new.instancemethod(greet,self,Person)
a = Person()
a.greet()
[/code]