Erlang与OO设计模式strategy模式

以前看过head first design patterns觉得是个不错的书,学习了一点设计模式,现在弄Erlang了,十分想两者结合对比着看看,不为别的,体会两者之间的区别跟联系,看看世界到底是OO的,还是functional的 :D 由于我并没有什么真正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构造那里,如果在实际系统中,这里可以根据不同的属性配置不同的函数,然后丢回给系统,在真正叫到的时候就可以做出不同的行为了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值