向UI框架内的对象提供全局配置数据

时间:2012-01-29 21:06:54

标签: python design-patterns

我正在研究一个基于文本的UI小部件库,并且已经决定现在是时候我为我的库用户提供了通过应用程序对象封装应用程序范围配置的能力,如下所示:

class App:

    def __init__(self, screen_size_tuple):
        self.screen_size = screen_size_tuple

    def get_screen_size(self):
        return self.screen_size

class Widget:

    def __init__(self, rows, cols, y, x, foo, bar, app):
        self.rows = rows
        self.original_dimensions = (rows, cols)
        self.original_coords = (y, x)
        #etc, etc
        self.app = app
        self.fullscreen = False     

    def self.toggle_fullscreen(self):
        if self.fullscreen != True:
            self.y = 0
            self.x = 0
            self.rows = self.app.screen_size[0] # y value from the application object
            self.cols = self.app.screen_size[1] # x value from the application object
        else:
            self.y = self.original_coords[0]
            self.x = self.original_coords[1]
            self.rows = self.original_dimensions[0]
            self.cols = self.original-dimensions[1]

我的问题有两个方面:首先,当我采用这种策略时,如何避免在创建时将App类的实例传递给每个小部件?将小部件创建委派给app对象本身的最佳做法是什么?其次,如果使用得当,这个设计模式是否有名称?它看起来有点像观察者或依赖注入,但我不确定这些模式是否适用于此。

提前致谢=)

1 个答案:

答案 0 :(得分:1)

如果您想要“应用程序范围但不是全局”配置,则有一些常见模式:

  1. 使用您的app对象创建窗口小部件对象,例如app.create(WidgetClass)
  2. 通过窗口小部件层次结构传递应用程序,如下所示:

  3. a = App()
    
    f = FrameWidget()
    a.add(f) # sets FrameWidget's config to a's config
    
    b = ButtonWidget()
    f.add(b) # sets ButtonWidget's config to f's config, which happens to be a's
    
    c = CheckboxWidget()
    f.add(c) # sets CheckboxWidget's config to f's config, also a's