我试图实现适配器模式。在MappingAdapter init对象中,我返回光数组。
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方法是如何通过Adapter从系统类中获取变量的。
发布于 2019-12-15 20:09:30
您有一个类System,需要一个light_mapper。light_mapper至少有一个lighten方法。与编写自己的light_mapper不同,您希望使用现有的类Light。但是Light没有lighten方法,您会感到被困住了。然后,您决定包装Light,使其适应System需求。这就是适配器模式:惟一允许(重新)写入的类是MappingAdapter。
在您的示例中,light_mapper和Light之间的最大区别是,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只提供其网格的副本,但这就是想法。希望能帮上忙。
https://stackoverflow.com/questions/59344479
复制相似问题