Bridge again (Re: Bridge-Pattern mit OCaml's Modul System (Re: [linux-l] Ocml vs. Java))
Oliver Bandel
oliver at first.in-berlin.de
So Sep 25 13:57:08 CEST 2005
OK,
muß man doch mit Funktoren machen.
War meine spontane Idee doch richtig.
Hier nun die Bridge mit Modulsystem von OCaml erledigt:
(Weil die devic keine konforme Schnittstelle haben, ist vorher noch der
Adapter angewendet. (Wollte das ganze Beispiel nicht nochmal umbauen))
==============================================================================
==============================================================================
(* ----------------------------------------------------------------- *)
(* Third Party Modules or something you don't want to change anymore *)
(* Or something like device-dependent stuff *)
(* ----------------------------------------------------------------- *)
module Dev_A =
struct
let print_dieses () = print_endline "Hallo, dies ist Variante Dev_A!"
let hide_me () = print_endline "Hide me!" (* not hidden yet *)
end
module Dev_B =
struct
let print_jenes () = print_endline "Hallo, dies ist Variante Dev_B!"
let hide_me_too () = print_endline "Hide me!" (* not hidden yet *)
end
module Dev_C =
struct
let print_noch_eins () = print_endline "Hallo, dies ist Variante Dev_C!"
let hide_me_please () = print_endline "Hide me!" (* not hidden yet *)
end
(* ----------------------------------------------------------------- *)
(* Now do the adaption (now using "module type" to save keystrokes) *)
(* ----------------------------------------------------------------- *)
module type Unified = sig val print: unit -> unit end
module Dev_A_unified =
(struct
include Dev_A
let print = print_dieses
(* and more adapter code if necessary *)
end : Unified)
module Dev_B_unified =
(struct
include Dev_B
let print = print_jenes
(* and more adapter code if necessary *)
end : Unified)
module Dev_C_unified =
(struct
include Dev_C
let print = print_noch_eins
(* and more adapter code if necessary *)
end : Unified)
(* ---------------------------------------------------- *)
module Device_Bridge = functor( Dev : Unified ) ->
struct
let abstract_print = Dev.print
(* add more code ("abstraction") here *)
end
(* ----------------------------------------------------------------- *)
(* Now: use the code..... *)
(* ----------------------------------------------------------------- *)
module Selected_Device = Device_Bridge (Dev_B_unified)
let _ = Dev_A_unified.print();
Dev_B_unified.print();
Dev_C_unified.print();
print_endline "=============";
Selected_Device.abstract_print()
==============================================================================
==============================================================================
Signatur des Files:
-------------------
==============================================================================
first:/tmp oliver$ ocamlc -i bridge-functors.ml
module Dev_A :
sig val print_dieses : unit -> unit val hide_me : unit -> unit end
module Dev_B :
sig val print_jenes : unit -> unit val hide_me_too : unit -> unit end
module Dev_C :
sig
val print_noch_eins : unit -> unit
val hide_me_please : unit -> unit
end
module type Unified = sig val print : unit -> unit end
module Dev_A_unified : Unified
module Dev_B_unified : Unified
module Dev_C_unified : Unified
module type Dev_ChangedInterface =
sig val anderes_interface_for_printing : string -> unit end
module Device_Bridge :
functor (Dev : Unified) -> sig val abstract_print : unit -> unit end
module Selected_Device : sig val abstract_print : unit -> unit end
first:/tmp oliver$
==============================================================================
Ergebnis des Programmlaufs:
---------------------------
==============================================================================
first:/tmp oliver$ ocaml bridge-functors.ml
Hallo, dies ist Variante Dev_A!
Hallo, dies ist Variante Dev_B!
Hallo, dies ist Variante Dev_C!
=============
Hallo, dies ist Variante Dev_B!
first:/tmp oliver$
==============================================================================
Bridge ready. :)
Ciao,
Oliver
Mehr Informationen über die Mailingliste linux-l