访问者模式

 一、访问者模式的概念

访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

将数据操作和数据结构分离的设计模式

访问者角色[Visitor]:定义了对每个 Element 访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的,因此,访问者模式要求元素的类型要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果出现这种情况,则说明不适合使用访问者模式
具体访问者角色[Concrete Visitor]:实现Visitor声明的操作,需要给出对每一个元素类访问时所产生的具体行为
元素角色[Element]:抽象类或者接口,定义一个Accept操作,它以访问者为参数
具体元素角色[Concrete Element]:具体的元素类,它提供接受访问的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法
对象结构角色[Object Structure]:这是使用访问者模式必备的角色,能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素

 

二、访问者模式的实现

//访问者
public interface IVisitor {

    void visit(ConcreteElement1 e1);
    void visit(ConcreteElement2 e2);

}
//具体访问者
public class Visitor implements IVisitor
{
    @Override
    public void visit(ConcreteElement1 e1)
    {
        e1.doSomething();
    }

    @Override
    public void visit(ConcreteElement2 e2)
    {
        e2.doSomething();
    }
}
//元素
public abstract class Element
{
    public abstract void accept(IVisitor visitor);
    public abstract void doSomething();
}
//具体元素
public class ConcreteElement1 extends Element
{
    @Override
    public void accept(IVisitor visitor)
    {
        visitor.visit(this);
    }

    @Override
    public void doSomething()
    {
        System.out.println("Element1");
    }
}
//具体元素
public class ConcreteElement2 extends Element
{
    @Override
    public void accept(IVisitor visitor)
    {
        visitor.visit(this);
    }

    @Override
    public void doSomething()
    {
        System.out.println("Element2");
    }
}
//对象结构
public class ObjectStructure
{
    public static List<Element> getList()
    {
        List<Element> list = new ArrayList<Element>();
        Random ran = new Random();
        for(int i=0;i<10;i++)
        {
            int a = ran.nextInt(100);
            if(a>50)
                list.add(new ConcreteElement1());
            else
                list.add(new ConcreteElement2());
        }
        return list;
    }
}
public class Main {
    public static void main(String[] args) {

        List<Element> list = ObjectStructure.getList();
        for(Element e:list){
            e.accept(new Visitor());
        }
    }
}

 

三、访问者模式的应用

  1. 对象结构比较稳定,但经常需要在此对象结构上定义新的操作
  2. 需要对一个对象结构中的对象进行很多不同的且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类

 

四、访问者の其他问题

各角色职责分离,符合单一职责原则;具有优秀的扩展性;使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化;灵活性

具体元素对访问者公布细节,违反了迪米特原则;具体元素变更时导致修改成本大;违反了依赖倒置原则,为了达到“区别对待”而依赖了具体类,没有以来抽象

 

五、Reference

设计模式:访问者模式(Vistor)

23种设计模式(9):访问者模式

访问者模式一篇就够了

 

六、Resource


       大话设计模式

       Head First 设计模式

       Java设计模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值