美文网首页
设计模式 - 21.访问者模式 [行为型模式]

设计模式 - 21.访问者模式 [行为型模式]

作者: Zszen | 来源:发表于2020-03-27 13:49 被阅读0次
大纲 小结
基础准则 基础准则
创建型模式 单例模式
- 原型模式
- 简单工厂模式
- 抽象工厂模式
- 建造者模式
结构型模式 代理模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 门面/外观模式
- 享元模式
- 组合模式
行为型模式 模板方法模式
- 策略模式
- 命令模式
- 职责链模式
- 状态模式
- 观察者模式
- 中介者模式
- 迭代器模式
- 访问者模式
- 备忘录模式
- 解释器模式

将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

import abc

class Container:
    def __init__(self):
        self.pool = []

    def add(self, obj):
        self.pool.append(obj)

    def remove(self, obj):
        if obj in self.pool:
            self.pool.remove(obj)

    def deal(self, cls:'ICls'):
        if cls.__class__ == ClsA:
            for i,k in enumerate(self.pool):
                cls.deal1(i,k)
        elif cls.__class__ == ClsB:
            for i,k in enumerate(self.pool):
                cls.deal2(i,k)

class ICls(metaclass=abc.ABCMeta):
    
    def __init__(self, type):
        self.type = type

    # @abc.abstractmethod
    def deal1(self, id, obj):
        pass

    # @abc.abstractmethod
    def deal2(self, id, obj):
        pass

class ClsA(ICls):
    def deal1(self, id, obj):
        print('cls%d'%self.type, obj)

class ClsB(ICls):
    def deal2(self, id, obj):
        print('cls%d'%self.type, [id, obj])



if __name__ == '__main__':
    a = ClsA(1)
    b = ClsB(2)
    container = Container()
    container.add({'a':123})
    container.add({'color':0xff00ff})
    container.deal(a)
    print('====')
    container.deal(b)

输出

cls1 {'a': 123}
cls1 {'color': 16711935}
====
cls2 [0, {'a': 123}]
cls2 [1, {'color': 16711935}]

如果语言支持多态, 条件可以改为多态

相关文章

网友评论

      本文标题:设计模式 - 21.访问者模式 [行为型模式]

      本文链接:https://www.haomeiwen.com/subject/plgxuhtx.html