带状态的模块
状态和模块名封装到一起,隐藏信息和创建适配器模块
元组模块:
-module(counter).
-export([bump/2, read/1]).
bump(N, {counter, K}) -> {counter, N + K}.
read({counter, N}) -> N.
新版本不支持元组模块。
适配器变量
有两个或多个功能相近的库,但无法决定要用哪一个。这些库可能具有相似的函数接口,但性能特征不同。能够在多种不同实现方式做选择。
-module(adapter_db1).
-export([new/1, store/3, lookup/2]).
new(dict) ->
{?MODULE, dict, dict:new()};
new(lists) ->
{?MODULE, list, []}.
store(Key, Val, {?MODULE, dict, D}) ->
D1 = dict:store(Key, Val, D),
{?MODULE, dict, D1};
store(Key, Val, {?MODULE, list, L}) ->
L1 = lists:keystore(Key, 1, L, {Key, Val}),
{?MODULE, list, L1}.
lookup(Key, {?MODULE, dict, D}) ->
dict:find(Key, D);
lookup(Key, {?MODULE, list, L}) ->
case lists:keysearch(Key, 1, L) of
{value, {Key, Val}} ->
{ok, Val};
false ->
error
end.
将dict和list两种不同的实现方式存在一个元组里,通过第二个字段原子类型来区分实现方式,接口通用且互不干扰。