Erlang与OO设计模式strategy模式
以前看过head first design patterns觉得是个不错的书,学习了一点设计模式,现在弄Erlang了,十分想两者结合对比着看看,不为别的,体会两者之间的区别跟联系,看看世界到底是OO的,还是functional的
由于我并没有什么真正OO的编程经验,难免错误很多,大家批判着看好了。
先看第一个模式strategy模式,大致上来说,就是对接口编程而不是具体实现编程,如果每个子类都有的功能,自然继承可以,如果不全有则比较麻烦,加在父类,则那些不需要的子类莫名其妙的有了,如果仅仅是一个接口,很多的子类又得全部去实现,总之就是多个子类,有少量的方法,既想代码的重用,又要避免扰乱,所以有了这个模式,创建一个单独的行为类,来实现可能的方法,然后子类谁用哪个就初始化个具体的object就可以了。
到了functional编程当中,似乎不必要做为了创建行为,赋给不同的人,而创建一个单独的类,因为可以直接创建一堆的行为函数,直接放在那里,并直接拿过来用就可以了。根据书上的示例代码,改写成了这样的Erlang代码:
-module(duck).-compile(export_all).-record(duck, {fly, quake}).fly(Duck) when is_record(Duck, duck) -> apply(Duck#duck.fly, []).quake(Duck) when is_record(Duck, duck) -> apply(Duck#duck.quake, []).swim(_Duck) -> io:format("All ducks float, even decoys!~n").fly_with_wings() -> io:format("I'm flying!~n").fly_no_way() -> io:format("I can't fly~n").quake() -> io:format("Quake~n").mute_quake() -> io:format("<< Silence >>~n").squeak() -> io:format("Squeak~n").%% main functionmain() -> Duck = mallard_duck(), quake(Duck), fly(Duck).mallard_duck() -> #duck{fly = fun fly_with_wings/0, quake = fun quake/0}.实践中用到的时候,比如应该就是主要对于mallard_duck构造那里,如果在实际系统中,这里可以根据不同的属性配置不同的函数,然后丢回给系统,在真正叫到的时候就可以做出不同的行为了。