28.访问者模式

package visitor;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/*
 * 访问者模式:
 * 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
 * 
 * 
 * 主要包括下面几个角色:
 *  抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
 *	访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
 *	抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
 *	元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
 *	结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。
 * 
 * 
 * 我感觉:说白了就是一句话,自己不调用自己的方法 ,而是把自己传递给别人 让别人调用自己的方法
 * 
 * 
 * 应用场景: 
 * 1.  假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,
 * 为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。
 * 2. 假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。
 * 
 */
public class Visitor {
	public static void main(String[] args) {
		 List<Element> list = ObjectStruture.getList();  
	        for(Element e: list){  
	            e.accept(new Visitors());  
	        }  
	}
}
/*
 * 抽象访问者类
 */
interface IVisitor {  
    public void visit(ConcreteElementA el1);  
    public void visit(ConcreteElementB el2);  
}  
/*
 * 访问者类
 */
class Visitors implements IVisitor {  
	  
    public void visit(ConcreteElementA elA) {  
    	elA.doSomething();  
    }  
      
    public void visit(ConcreteElementB elB) {  
    	elB.doSomething();  
    }  
}  
/*
 * 元素类
 */
abstract class Element {  
    public abstract void accept(IVisitor visitor);  
    public abstract void doSomething();  
}  

class ConcreteElementA extends Element {  
    public void doSomething(){  
        System.out.println("元素A");  
    }  
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  
}  
  
class ConcreteElementB extends Element {  
    public void doSomething(){  
        System.out.println("这是元素2");  
    }  
      
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  
}  

/*
 * 结构体类
 */
class ObjectStruture {  
    public static List<Element> getList(){ 
    	//这里存着多个Element对象 
        List<Element> list = new ArrayList<Element>();  
        Random ran = new Random();  
        for(int i=0; i<5; i++){  
            int a = ran.nextInt(50);  
            if(a>25){  
                list.add(new ConcreteElementA());  
            }else{  
                list.add(new ConcreteElementB());  
            }  
        }  
        return list;  
    }  
}  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值