美文网首页设计模式
设计模式之访问者模式(23)

设计模式之访问者模式(23)

作者: _兜兜转转_ | 来源:发表于2019-05-23 11:19 被阅读6次

访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

介绍

意图:主要将数据结构与数据操作分离。

主要解决:稳定的数据结构和易变的操作耦合问题。

何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。

如何解决:在被访问的类里面加一个对外提供接待访问者的接口。

关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。

应用实例:您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。

优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。

缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。

注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。

实现

我们将创建一个定义接受操作的 ComputerPart 接口。KeyboardMouseMonitorComputer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor,它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。

VisitorPatternDemo,我们的演示类使用 ComputerComputerPartVisitor 类来演示访问者模式的用法。

访问者模式的 UML 图

步骤 1
定义一个表示元素的接口。

@interface ComputerPart :NSObject <NSObject>
@property (nonatomic,strong)NSMutableArray *list;
- (void)accept:(id<ComputerPartVisitor>)com;
@end

步骤 2
创建扩展了上述类的实体类。

@interface Mouse : ComputerPart

@end
@interface Computer : ComputerPart

@end

@implementation Mouse
- (void)accept:(id<ComputerPartVisitor>)com{
    [com visitMouse:self];
}
@end
@implementation Computer

- (void)accept:(id<ComputerPartVisitor>)com{
    for (ComputerPart *item in self.list) {
        [item accept:com];
    }
    [com visit:self];
}
- (instancetype)init{
    self =[super init];
    self.list=[NSMutableArray array];
    [self.list addObject:[Mouse new]];
    return self;
}
@end

步骤 3
定义一个表示访问者的接口。

@protocol ComputerPartVisitor <NSObject>

- (void)visit:(Computer *)pt;
- (void)visitMouse:(Mouse *)mou;

@end

步骤 4
创建实现了上述类的实体访问者。

@interface ComputerDisplayVisitor : NSObject< ComputerPartVisitor>
- (void)visitMouse:(Mouse *)mou;
- (void)visit:(Computer *)pt;
@end

@implementation ComputerDisplayVisitor

- (void)visitMouse:(Mouse *)mou{
    NSLog(@"display mouse");
}
- (void)visit:(Computer *)pt{
    NSLog(@"display computer");
}

@end

步骤 5
使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。

  ComputerPart *part=[Computer new];
    [part accept:[ComputerDisplayVisitor new]];

步骤 6
执行程序,输出结果:

2019-05-23 11:14:36.133715+0800 test[2832:21862177] display mouse
2019-05-23 11:14:36.133827+0800 test[2832:21862177] display computer

参考资料
runoob

相关文章

  • 设计模式之访问者(Visitor)

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式...

  • Android 访问者模式

    Android 设计模式系列文章 Android 23种设计模式 前言 访问者模式是一种把数据操作与数据结构分离的...

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 设计模式之访问者模式(23)

    访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通...

  • 行为型模式:访问者模式

    文章首发:行为型模式:访问者模式 十一大行为型模式之十一:访问者模式。 简介 姓名 :访问者模式英文名 :Visi...

  • 设计模式分享系列

    分享内容提纲 设计模式分享之Concept 设计模式》概念(起源)》分类》 分类》23种设计模式》举例 设计模式分...

  • 访问者模式一篇就够了

    访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,...

  • 访问者模式

    访问者模式属于行为型模式。访问者模式是一种将数据结构和数据操作分离的设计模式。访问者模式比较复杂,而且实际使用的地...

  • 设计模式之禅

    设计模式之禅介绍了23种设计模式,很有价值

网友评论

    本文标题:设计模式之访问者模式(23)

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