设计模式之访问者模式

来源:互联网 发布:无线暴力破解软件 编辑:程序博客网 时间:2024/06/07 02:55

访问者模式的结构

这里写图片描述

基本代码

import java.util.ArrayList;import java.util.List;public abstract class Visitor{    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);}public abstract class Element{    public abstract void Accept(Visitor visitor);}public class ConcreteElementA extends Element{    @Override    public void Accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visitConcreteElementA(this);    }}public class ConcreteElementB extends Element{    @Override    public void Accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visitConcreteElementB(this);    }}public class ConcreteVisitor1 extends Visitor{    @Override    public void visitConcreteElementA(ConcreteElementA concreteElementA) {        // TODO Auto-generated method stub        System.out.println(this.getClass()+" visit "+concreteElementA.getClass());    }    @Override    public void visitConcreteElementB(ConcreteElementB concreteElementB) {        // TODO Auto-generated method stub        System.out.println(this.getClass()+" visit "+concreteElementB.getClass());    }}public class ConcreteVisitor2 extends Visitor{    @Override    public void visitConcreteElementA(ConcreteElementA concreteElementA) {        // TODO Auto-generated method stub        System.out.println(this.getClass()+" visit "+concreteElementA.getClass());    }    @Override    public void visitConcreteElementB(ConcreteElementB concreteElementB) {        // TODO Auto-generated method stub        System.out.println(this.getClass()+" visit "+concreteElementB.getClass());    }}public class ObjectStructure{    private List<Element> lists = new ArrayList<Element>();    public void addElement(Element element)    {        lists.add(element);    }    public void deleteElement(Element element)    {        lists.remove(element);    }    public void Accept(Visitor visitor)    {        for (Element element : lists)         {            element.Accept(visitor);        }    }}class Client{    public static void main()    {        ObjectStructure objectStructure = new ObjectStructure();        objectStructure.addElement(new ConcreteElementA());        objectStructure.addElement(new ConcreteElementB());        ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1();        ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2();        objectStructure.Accept(concreteVisitor1);        objectStructure.Accept(concreteVisitor2);    }}

举个例子

比如 有男人和女人的例子:
状态(成功,失败,恋爱)
人(男人,女人)
对象 结构ObjectStuctur
客户端Client

/** * "状态"抽象类 */public abstract class Action {    //得到男人结论或反应    public abstract void GetManConclusion(man concretElementA);    //得到女人结论或反应    public  abstract  void GetWomanConclusion(woman concretElementB);}/** * 成功状态的具体类 */public class Success extends  Action{    @Override    public void GetManConclusion(man concretElementA) {        System.out.println("man 成功时,背后多半有一个伟大的女人");    }    @Override    public void GetWomanConclusion(woman concretElementB) {        System.out.println("woman 成功时,背后大有一个不成功的男人");    }}/** * 失败状态的具体类 */public class Failing extends  Action{    @Override    public void GetManConclusion(man concretElementA) {        System.out.println("man失败时,闷头喝酒, 谁也不用劝");    }    @Override    public void GetWomanConclusion(woman concretElementB) {        System.out.println("woman失败时,眼泪汪汪,谁也劝不了");    }}/** * 恋爱状态具体类 */public class Amativeness  extends  Action{    @Override    public void GetManConclusion(man concretElementA) {        System.out.println("man恋爱时,凡是不懂也要装懂");    }    @Override    public void GetWomanConclusion(woman concretElementB) {        System.out.println("woman恋爱时,遇事懂也装作不懂");    }}/** * “人” 抽象类 ,是“男人”和“女人”的抽象类 */public abstract class Person {    //接受状态对象    public abstract void Accept(Action visitor);}/** * "男人"类 */public class man extends Person {    @Override    public void Accept(Action visitor) {        visitor.GetManConclusion(this);    }}/** * "女人"类 */public class woman extends Person{    @Override    public void Accept(Action visitor) {        visitor.GetWomanConclusion(this);    }}/** * 对象结构 */public class ObjectStucture {    private ArrayList<Person> elements = new ArrayList<Person>();    //增加    public void Attach(Person element)    {        elements.add(element);    }    //移除    public void Detach(Person element)    {        elements.remove(element);    }    //查看显示    public void display(Action visitor)    {        for (Person element : elements)        {            element.Accept(visitor);        }    }}/** * 客户端代码 */public class Client {    public static void main(String[] args) {        ObjectStucture o = new ObjectStucture();        o.Attach(new man());        o.Attach(new woman());        //成功时反应        Success success = new Success();        o.display(success);        //失败时的反应        Failing failing = new Failing();        o.display(failing);        //恋爱时的反应        Amativeness amativeness = new Amativeness();        o.display(amativeness);    }}

访问者模式的优点,缺点,目的

访问者模式的目的是把处理从数结构中分离出来;
优点 适用于稳定的系统;
但是缺点就是增加新的数据结构比较困难。

访问者模式的能力和复杂性是把双刃剑,只有当真正需要它的时候,才考虑使用它。

0 0
原创粉丝点击