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