设计模式-访问者模式

1.定义

当外部需要访问一个组合系统中所有对象的状态时,可以定义一个访问者类,通过访问者类访问组合系统中所有对象的状态,外部系统只需要对接访问者类即可获取到组合系统中所有对象的状态

2.使用场景及设计

2.1.使用场景

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

2.2.设计

定义一个访问者接口Visitor和实现类ConcreteVisitor,定义一个Computer对象,其中有Keyboard类、Monitor类、Mouse类等组件,且都继承Part接口。
类图如下:
在这里插入图片描述

3.测试代码

入口代码

package com.glt.designpattern.visitor;

public class InitMain {

    public static void main(String[] args) {

        Computer computer = new Computer();

        Visitor v = new ConcreteVisitor();

        computer.accept(v);
    }
}

访问者接口

package com.glt.designpattern.visitor;

public interface Visitor {

    public void visitor(Computer computer);
    public void visitor(Keyboard keyboard);
    public void visitor(Mouse mouse);
    public void visitor(Monitor monitor);
}

访问者类

package com.glt.designpattern.visitor;

public class ConcreteVisitor implements Visitor {

    @Override
    public void visitor(Computer computer) {
        System.out.println(" this is computer");
    }

    @Override
    public void visitor(Keyboard keyboard) {
        System.out.println(" this is keyboard");
    }

    @Override
    public void visitor(Mouse mouse) {
        System.out.println(" this is mouse");
    }

    @Override
    public void visitor(Monitor monitor) {
        System.out.println(" this is monitor");
    }
}

Computer 类

package com.glt.designpattern.visitor;

public class Computer implements Part {
    private Part[] parts;

    public Computer() {
        parts = new Part[]{new Keyboard(), new Monitor(), new Mouse()};
    }

    @Override
    public void accept(Visitor visitor) {

        for (Part part: parts) {
            part.accept(visitor);
        }
        visitor.visitor(this);
    }


}

组件类

package com.glt.designpattern.visitor;

public class Keyboard implements Part{

    public void accept(Visitor visitor){
        visitor.visitor(this);
    }
}

package com.glt.designpattern.visitor;

public class Monitor implements Part{

    public void accept(Visitor visitor){
        visitor.visitor(this);
    }
}

package com.glt.designpattern.visitor;

public class Mouse implements Part{

    public void accept(Visitor visitor){
        visitor.visitor(this);
    }
}

组件接口类

package com.glt.designpattern.visitor;

public interface Part {

    public void accept(Visitor visitor);
}

输入如下:

this is keyboard
this is monitor
this is mouse
this is computer

4.总结

优点:

  • 允许对组合结构中加入新的操作,无需修改结构本身
  • 想要加入新操作比较容易
  • 访问者所进行的操作代码集中在一起,方便管理

缺点:
访问者会打破组合的封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值