首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对适配器模式的理解

对适配器模式的理解
EN

Stack Overflow用户
提问于 2019-12-15 13:44:37
回答 1查看 94关注 0票数 0

我试图实现适配器模式。在MappingAdapter init对象中,我返回光数组。

代码语言:javascript
复制
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从系统类中获取变量的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-15 20:09:30

您有一个类System,需要一个light_mapperlight_mapper至少有一个lighten方法。与编写自己的light_mapper不同,您希望使用现有的类Light。但是Light没有lighten方法,您会感到被困住了。然后,您决定包装Light,使其适应System需求。这就是适配器模式:惟一允许(重新)写入的类是MappingAdapter

在您的示例中,light_mapperLight之间的最大区别是,light_mapper似乎没有拥有它的grid:网格作为参数传递给lighten方法。相反,Light拥有它的grid,不提供修改它的方法(set_dim重置它,但仅此而已)。

目前还不清楚您想要实现什么,但是如果您认为破坏封装是可以接受的,则可以重写MappingAdapter

代码语言:javascript
复制
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只提供其网格的副本,但这就是想法。希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59344479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档