[英]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_mapper
, 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
只是提供了其網格的副本,但這就是想法。 希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.