Альтернативное описание паттернов проектирования: facade

в 4:21, , рубрики: python, образование, паттерны проектирования, метки: , ,

Продолжение топика Альтернативное описание паттернов проектирования

Facade — позволяет скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

На нашем, осмысленном примере это означает, что строим класс FileFacade в котором инкапсулируем все возможности работы с нашей файловой системой.

Для удобства сравнения кода с базовым примером, он слева, добавлена картинка аля — diff.

Изображение - savepic.su — сервис хранения изображений

Сам код примера.

# -*- coding: utf-8 -*-

fileSystem = None

class File:
  def __init__(self, size):
    self.size = size
    self.ind = fileSystem.create(self)
    self.parent = None

  def name(self):
    if not self.parent:
      return ""
    else:
      return self.parent.getName(self.ind)

class Dir:
  def __init__(self):
    self.ind = fileSystem.create(self)
    self.parent = None
    self.container = {}

  def getName(self, ind):
    return self.name() + self.container[ind]

  def name(self):
    if not self.parent:
      return ""
    else:
      return self.parent.getName(self.ind) + "/"

  def size(self):
    return len(self.container)

  def add(self, name, file):
    file.parent = self
    self.container[file.ind] = name

class Root(Dir):
  def __init__(self):
    Dir.__init__(self)

  def name(self):
    return "/"

class Link:
  def __init__(self, link):
    self.link = link
    self.ind = fileSystem.create(self)
    self.parent = None

  def name(self):
    if not self.parent:
      return " -> " + self.link.name()
    else:
      return self.parent.getName(self.ind) + " -> " + self.link.name()

  def size(self):
    return 8

class FileSystem:
  def __init__(self):
    self.container = {}

  def create(self, file):
    ind = hash(file)
    self.container[ind] = file
    return ind

  def find(self, name):
    for value in self.container.itervalues():
      if value.name() == name:
        return value
    return None

  def printAll(self):
    for value in self.container.itervalues():
      if isinstance(value, File):
        print "file: %8d %s" % (value.size, value.name())
      elif isinstance(value, Dir):
        print " dir: %8d %s" % (value.size(), value.name())
      elif isinstance(value, Link):
        print "link: %8d %s" % (value.size(), value.name())

class FileFacade:
  def __init__(self):
    global fileSystem
    fileSystem = FileSystem()

  def createFile(self, size):
    file = File(size)
    fileSystem.create(file)
    return file

  def createDir(self):
    file = Dir()
    fileSystem.create(file)
    return file

  def createRoot(self):
    file = Root()
    fileSystem.create(file)
    return file

  def createLink(self, link):
    file = Link(link)
    fileSystem.create(file)
    return file

  def add(self, folder, name, file):
    folder.add(name, file)

  def find(self, name):
    return fileSystem.find(name)

  def printAll(self):
    fileSystem.printAll()

if __name__ == "__main__":
  fileFacade = FileFacade()
  root = fileFacade.createRoot()
  etc = fileFacade.createDir()
  fileFacade.add(root, "etc", etc)
  home = fileFacade.createDir()
  fileFacade.add(root, "home", home)
  user = fileFacade.createDir()
  fileFacade.add(home, "user", user)
  fileFacade.add(user, "readme.txt", fileFacade.createFile(1177))
  fileFacade.add(user, ".etc", fileFacade.createLink(etc))
  fileFacade.printAll()
  print "find('/home/user')=", fileFacade.find("/home/user")
  print "find('/home/user/')=", fileFacade.find("/home/user/")

В результате выполнения кода имеем повтор результата базового примера с точностью до перестановки строк вывода:

 dir:        2 /home/user/
file:     1177 /home/user/readme.txt
link:        8 /home/user/.etc -> /etc/
 dir:        2 /
 dir:        0 /etc/                                                                                
 dir:        1 /home/                                                                               
find('/home/user')= None                                                                            
find('/home/user/')= <__main__.Dir instance at 0x7f5c4efb8c20>                                      

Автор: bya

Поделиться

* - обязательные к заполнению поля