Продолжение топика Альтернативное описание паттернов проектирования
Facade — позволяет скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
На нашем, осмысленном примере это означает, что строим класс FileFacade в котором инкапсулируем все возможности работы с нашей файловой системой.
Для удобства сравнения кода с базовым примером, он слева, добавлена картинка аля — diff.
Сам код примера.
# -*- 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