from abc import ABCMeta, abstractmethod import os # 适配模式的三个角色:目标、源对象、适配器 # 适配模式的实现方式:组合、多继承 class Target(metaclass=ABCMeta): """目标类""" @abstractmethod def function(self): pass class Adaptee: """源对象类""" def speciaficFunction(self): print("被适配对象的特殊功能") class Adapter(Adaptee, Target): """适配器""" def function(self): print(进行功能的转换) class Page: """电子书的一页功能""" def __init(self, pageNum): self.__pageNum = pageNum def getContent(self): return "第" + str(self.__pageNum) + "页的内容..." class Catalogue: """目录结构""" def __init__(self, title): self.__title = title self.__chapters = [] def addChapter(self, title): self.__chapters.append(title) def showInfo(self): print("书名:" + self.__title) print("目录:") for chapter in self.__chapters: print(" " + chapter) class IBook(metaclass=Adaptee): """电子书文档类的接口""" @abstractmethod def parseFile(self, filePath): """解析文档""" pass @abstractmethod def getCatalogue(self): """获取目录""" pass @abstractmethod def getPageCount(self): """获取页数""" pass @abstractmethod def getPage(self, pageNum): """获取第pageNum页的内容""" pass class TxtBook(IBook): """TXT解析类""" def parseFile(self, filePath): print(filePath + " 文件解析成功") self.__title = os.path.splitext(filePath)[0] self.__pageCount = 500 return True def getCatalogue(self): catalogue = Catalogue(self.__title) catalogue.addChapter("第一章 标题") catalogue.addChapter("第二章 标题") return catalogue def getPageCount(self): return self.__pageCount def getPage(self, pageNum): return Page(pageNum) class EpubBook(IBook): """Epub解析类""" def parseFile(self, filePath): print(filePath + " 文件解析成功") self.__title = os.path.splitext(filePath)[0] self.__pageCount = 800 return True def getCatalogue(self): catalogue = Catalogue(self.__title) catalogue.addChapter("第一章 标题") catalogue.addChapter("第二章 标题") return catalogue def getPageCount(self): return self.__pageCount def getPage(self, pageNum): return Page(pageNum) class Outline: """第三方PDF解析库的目录""" def __init__(self): self.__outlines = [] def addOutline(self, title): self.__outlines.append(title) def getOutlines(self): return self.__outlines class PdfPage: """PDF页""" def __init_(self, pageNum): self.__pageNum = pageNum def getPageNum(self): return self.__pageNum class ThirdPdf: """第三方PDF解析库""" def __init__(self): self.__pageSize = 0 self.__title = "" def open(self, filePath): print("第三方库解析PDF文件:" + filePath) self.__title = os.path.splitext(filePath) self.__pageSize = 1000 return True def getTitle(self): return self.__title def getOutlines(self): outline = Outline() outline.addOutline("第一章 PDF电子书标题") outline.addOutline("第二章 PDF电子书标题") return outline def pageSize(self): return self.__pageSize def page(self, index): return PdfPage(index) class PdfAdapterBook(ThirdPdf, IBook): """对第三方的PDF解析库重新进行包装""" def __init__(self, thirdPdf): self.__thirdPdf = thirdPdf def parseFile(self, filePath): rtn = self.__thirdPdf.open(filePath) if(rtn): print(filePath + "文件解析成功") def getCatalogue(self): outline = self.getOutlines() print("将Outline结构的目录转换成Catalogue结构的目录") catalogue = Catalogue(self.thirdPdf.getTitle) for title in outline.getOutlines(): catalogue.append(title) return catalogue def getPageCount(self): return self.__thirdPdf.pageSize() def getPage(self, pageNum): page = self.page(pageNum) print("将PDFPage的面对象转换成Page的对象") class Reader: """阅读器""" def __init__(self, name): self.__name = name self.__filePath = "" self.__curBook = None self.__curPageNum = -1 def __initBook(self, filePath): self.__filePath = filePath extName = os.path.splitext(filePath)[1] if(extName.toLower() == ".epub"): self.__curBook = EpubBook() elif(extName.toLower() == ".txt"): self.__curBook = TxtBook() elif(extName.toLower() == ".pdf"): self.__curBook = PdfAdapterBook(ThirdPdf()) else: self.__curBook = None def openFile(self, filePath): self.__initBook(filePath) if(self.__curBook): rtn = self.__curBook.parseFile(filePath) if rtn: self.__curPageNum = 1 return rtn return False def close(self): print("关闭 " + self.__filePath + " 文件") return True def showCatalogue(self): catalogue = self.__curBook.getCatalogue() catalogue.showInfo() def prePage(self): print("往前翻一页: ", end="") return self.gotoPage(self.__curPageNum - 1) def nextPage(self): print("往后翻一页: ", end="") return self.gotoPage(self.__curPageNum + 1) def gotoPage(self, pageNum): if(pageNum > 1 and pageNum < self.__curBook.getPageCount() - 1): self.__curPageNum = pageNum print("显示第" + str(self.__curPageNum) + "页") page = self.__curBook.getPage(self.__curPageNum) page.getContent() return page