Pattern question

bruno modulix onurb at xiludom.gro
Fri Jul 8 04:53:50 EDT 2005


cantabile wrote:
> Hi,
> 
> I'm trying to write a small installer for a server. But this program
> should be able to run in the future under heterogenous environments and
> os (at least linux/windows). I mean, the install will be done either in
> text mode or curses or gtk or tk, either in debian or windows 2000 and
> so on...
> 
> The idea, at the moment, is as follows :
> 
> class Server:
>     def __init__(self, params = None):
>         self.params = params
>     def __getattr__(self, attr):
>         return self.params.get(attr, None)
> 
> class Installer:
>      def __init__(self, gui = None):
>         self.gui =  gui
>         self.srv = None
> 
>     def update(self, dict):
>         self.srv = Server(dict)
> 
> class Gui:
>     def __init__(self, installer = None):
>         self.installer = installer
>     def main():
>     ## Some stuff here calling doIt() when the
>     ## user is done with filling various fields
> 
>     def doIt(self):
>         dict = {"param1":"qwerty", "param2":"uiop"}
>         self.installer.update(dict)
> 
> def main():
>     inst = Installer()
>     gui =  Gui(inst)
>     inst.gui = gui
>     inst.gui.main()
> 
>     ## Here will be the actual install method
>     ## ...
> 
>     ## An example of accessing srv values:
>     print inst.srv.param1, inst.srv.param2
> 
> But, considering this code, I find the 3 first lines of my main() a bit
> heavy. I have to inform inst that it has a 'gui', and Gui that it has an
> 'installer'. I was trying to implement something looking like (very
> roughly) to the Observer pattern (so that the Gui would be totally
> independant from the actual install process).
>  I guess there is something wrong in my approach. Is there a better
> pattern than this one for that kind of stuff ?
> 
> Tanks for your help.

You may want to have a look at the Factory pattern...

# outrageously oversimplified dummy exemple
class Gui(object):
   def __init__(self, installer):
     self.installer = installer

class PosixGui(Gui):
   pass

class Win32Gui(Gui):
   pass

class GuiFactory(object):
   def getGui(self, installer):
      if os.name == 'posix':
         return PosixGui(installer)
      elif os.name == 'win32':
          return Win32Gui(installer)
      else:
          raise "os %s not supported" % os.name

class Installer(object):
   def __init__(self, guiFactory):
      self.gui = guiFactory.getGui(self)

def main():
   inst = Installer(GuiFactory())
   return inst.gui.main()

NB 1:
You may want to hide away the gui stuff:

class Installer(object):
  def __init__(self):
    self.gui = GuiFactory().getGui(self)

  def main(self):
    return self.gui.main()

def main():
  return Installer().main()


NB 2 :
if it has to run in text mode, you should consider renaming "gui" to
"ui", since a CLI is not really a 'graphical' ui !-)

NB 3 :
I made the GuiFactory a class, but it could also be a simple function.

NB 4 :
there are of course other solutions to the problem, which may or  not be
more appropriate...


HTH
-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list