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 function
main() ->
    Duck = mallard_duck(),
    quake(Duck),
    fly(Duck).

mallard_duck() ->
    #duck{fly = fun fly_with_wings/0,
          quake = fun quake/0}.



实践中用到的时候,比如应该就是主要对于mallard_duck构造那里,如果在实际系统中,这里可以根据不同的属性配置不同的函数,然后丢回给系统,在真正叫到的时候就可以做出不同的行为了。

你可能感兴趣的:(设计模式,编程,erlang,OO)