JAVA的23种设计模式---访问者模式

来源:互联网 发布:linux高性能服务器 pdf 编辑:程序博客网 时间:2024/06/16 19:14

概要:

该文章参考了《设计模式之禅》一书及一些前辈的博客文章

1.该文章阐述了访问者模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;

正文:

访问者模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

1.通用访问者模式模板代码实现:

package com.csdn;/** * 抽象元素 * @author Administrator * */public abstract class Element {    //定义业务逻辑    public abstract void doSomething();    //允许谁访问    public abstract void accept(IVisitor visitor);}
package com.csdn;/** * 具体元素A * @author Administrator * */public class ConcreteElementA extends Element{    //完善业务逻辑    @Override    public void doSomething() {        System.out.println("元素A");    }    //允许哪个访问者访问    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }}
package com.csdn;/** * 具体元素B * @author Administrator * */public class ConcreteElementB extends Element{    //完善业务逻辑    @Override    public void doSomething() {        System.out.println("元素B");    }    //允许哪个访问者访问    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }}
package com.csdn;/** * 抽象访问者 * @author Administrator * */public interface IVisitor {    //可以访问哪些对象    public void visit(ConcreteElementA cea);    public void visit(ConcreteElementB ceb);}
package com.csdn;/** * 具体访问者 * @author Administrator * */public class Visitor implements IVisitor {    //访问A元素    @Override    public void visit(ConcreteElementA cea) {        cea.doSomething();    }    //访问B元素    @Override    public void visit(ConcreteElementB ceb) {        ceb.doSomething();    }}
package com.csdn;import java.util.Random;/** * 结构对象 * @author Administrator * */public class ObjectStruture {    //对象生成器    public static Element createElement(){        Random random = new Random();        if(random.nextInt(100) > 50){            return new ConcreteElementA();        }else{            return new ConcreteElementB();        }    }}
package com.csdn;/** * 场景类 * @author Administrator * */public class Client {    public static void main(String[] args) {        for(int i = 0 ; i < 10 ; i++){            //获得元素            Element element = ObjectStruture.createElement();            //接受访问者访问            element.accept(new Visitor());        }    }}

输出:(输出结果不确定)

元素B元素A元素B元素A元素A元素A元素B元素A元素A元素A

注:
a:访问者模式有抽象访问者、具体访问者、抽象元素、具体元素、结构对象五个角色。

未完待续…

原创粉丝点击