簡體   English   中英

理解適配器模式

[英]Understanding of adapter-pattern

我嘗試實現適配器模式。 在 MappingAdapter init Light 對象中,然后我返回光陣列。

class Light:
    def __init__(self, dim):
        self.dim = dim
        self.grid = [[0 for i in range(dim[0])] for _ in range(dim[1])]
        self.lights = []
        self.obstacles = []

    def set_dim(self, dim):
        self.dim = dim
        self.grid = [[0 for i in range(dim[0])] for _ in range(dim[1])]

    def set_lights(self, lights):
        self.lights = lights
        self.generate_lights()

    def set_obstacles(self, obstacles):
        self.obstacles = obstacles
        self.generate_lights()

    def generate_lights(self):
        return self.grid.copy()
class MappingAdapter(Light):
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def lighten(self, grid):
        self.adaptee.set_dim(self.adaptee.dim)
        self.adaptee.set_lights(self.adaptee.lights)
        return self.adaptee.generate_lights()

class System():
    def __init__(self, light_mapper):

        self.mape = self.grid = [[0 for i in range(30)] for _ in range(20)]
        self.mape[5][7] = 1 # Источники света
        self.mape[5][2] = -1 # Стены
        self.light_mapper = light_mapper

    def get_lightening(self):
        self.lightmap = self.light_mapper.lighten(self.mape)
        return self.lightmap

dim = (10,10)
light = Light(dim)
adapter = MappingAdapter(light)
system = System(adapter)

不幸的是,我不明白 Light 方法如何通過適配器從 System 類獲取變量。

您有一個需要light_mapper的類System 所述light_mapper具有至少一個方法lighten 與其編寫自己的light_mapperlight_mapper使用現有的Light類。 但是Light沒有lighten方法,您會感到卡住了。 然后您決定包裝Light以使其適應System要求。 這就是適配器模式:您唯一可以(重新)編寫的類是MappingAdapter

在你的情況下,相差很大light_mapperLight就是light_mapper似乎不擁有自己的grid :網格作為參數傳遞的lighten法。 相比之下, Light擁有它的grid並且不提供修改它的方法( set_dim重置它,但僅此而已)。

目前尚不清楚您要實現的目標,但如果您發現破壞封裝可以接受,則可以重寫MappingAdapter

class MappingAdapter: # do not inherit Light
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def lighten(self, grid):
        # self.adaptee.set_dim(self.adaptee.dim) # resets the grid
        # self.adaptee.set_lights(self.adaptee.lights) # does nothing
        self.adaptee.grid = grid.copy() # will copy System.mape to Light.grid
        return self.adaptee.generate_lights()

這樣,您只能得到System.mape副本的副本,因為Light.generate_lights只是提供了其網格的副本,但這就是想法。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM