为什么要使用behaviour,如果您对erlang有所了解的话,就明白其中的好处。
可以做到代码通用,可以减少错误,可以使用很多成熟的久经考验的模式,可以减轻无谓的重复劳动等等。。
有些时候,你可能需要定义自己的behaviour,这可不仅仅是OTP的权力。
自己定义behaviour非常简单,仅仅需要几步。
下面是一个例子:
-module(my_behaviour).
-export([behaviour_info/1]).
behaviour_info(callbacks) ->
[{init,1},
{handle, 2}];
behaviour_info(_Other) ->
undefined.
-export([start/1, stop/0]).
start(Mod) ->
State = Mod:init(0),
{ok, State2} = Mod:handle(add, State),
io:format("state :~p~n", [State2]).
stop() ->
stop.
上面就定义了一个名叫my_behaviour的behaviour,其需要两个回调函数:init/1和handle/1,以后在使用这个behaviour时,只需要export这两个回调函数即可。
如:
-module(use_my_behaviour).
-behaviour(my_behaviour).
%%behaviour callback function
-export([init/1, handle/2]).
init(State) ->
io:format("init ~p~n", [State]),
State.
handle(Request, State) ->
io:format("handle request:~p state:~p", [Request, State]),
State2 = State + 1,
{ok, state2}.
使用:
$erl
> my_behaviour:start(use_my_behaviour).
为了您的behaviour更易使用,您需要对behaviour的功用和回调函数的参数,返回值等进行详细的说明。具体可以参考OTP中gen_server等behaviour的实现。