访问者模式(java版)

来源:互联网 发布:淘宝店铺怎么才能靠前 编辑:程序博客网 时间:2024/06/03 13:40

1.引入

访问者模式就是将对象的数据结构(对象数据的存储)与对象的行为(对象的方法)相分离,避免了数据结构与操作的耦合。而访问者作为数据结构的操作者,如果想要增加数据结构的操作,那么只需要增加访问者就行了。所以前提是数据结构不变而操作可变,增加操作很容易,更改数据结构很困难。

2.举例

在生活中,我们在网上有公共的数据、也有个人的数据,而它们数据的存储结构是无变化的,变化的只是不同的访问者,去查看数据而已。

3.形式

抽象访问者:Visitor.class

具体访问者:ConcreteVisitorA.class和ConcreteVisitorB.class

抽象数据:Data.class

具体数据:PersonData.class和CommonData.class

数据结构:DataStructure.class

4.实现

--4.1抽象访问者:

public interface Visitor {public void query(Data data);}

--4.2具体访问者:

public class ConcreteVisitorA implements Visitor{//具体访问者A@Overridepublic void query(Data data) {// TODO Auto-generated method stubSystem.out.println("具体访问者A,访问:"+data.getClass().getName()+"数据");}}public class ConcreteVisitorB implements Visitor{    //具体访问者B    @Override    public void query(Data data) {        // TODO Auto-generated method stub        System.out.println("具体访问者B,访问:"+data.getClass().getName()+"数据");    }}

--4.3抽象数据:

public interface Data {public void accept(Visitor visitor);}

--4.4具体数据:

public class CommonData implements Data{//公共数据@Overridepublic void accept(Visitor visitor) {// TODO Auto-generated method stubvisitor.query(this);}}public class PersonData implements Data{    //个人数据    @Override    public void accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.query(this);    }}

--4.5数据结构类:

public class DataStructure {private List<Data> list=new ArrayList<Data>();public void addInformation(Data info){list.add(info);}public void removeInformation(Data info){list.remove(info);}public void accept(Visitor visitor){for(Data info:list){info.accept(visitor);}}}

测试类:

public class Test {public static void main(String[] args) {DataStructure is=new DataStructure();PersonData personData=new PersonData();CommonData commonData=new CommonData();Visitor concreteVisitorA=new ConcreteVisitorA();Visitor concreteVisitorB=new ConcreteVisitorB();is.addInformation(personData);is.addInformation(commonData);is.accept(concreteVisitorA);is.accept(concreteVisitorB);System.out.println("------------删除了个人数据-------------");is.removeInformation(personData);is.accept(concreteVisitorA);is.accept(concreteVisitorB);}}

结果:

具体访问者A,访问:cn.spy.design.PersonData数据
具体访问者A,访问:cn.spy.design.CommonData数据
具体访问者B,访问:cn.spy.design.PersonData数据
具体访问者B,访问:cn.spy.design.CommonData数据
------------删除了个人数据-------------
具体访问者A,访问:cn.spy.design.CommonData数据
具体访问者B,访问:cn.spy.design.CommonData数据

-----------------------------------------------------------------------------------------------------

总结:

访问者模式就是将数据结构与结构上的操作解耦,在不改变元素类的情况下,自由增加这些元素的新操作。适用于数据结构稳定,算法随意变化的环境。







0 0