访问者模式
意图:主要将数据结构与数据操作分离。
写一个demo:,这个demo称之为元素,而元素里的每一个属性称之为每一条数据,从而推为数据库中的一张表。类的属性称之为数据结构,set和get方法称之为行为。属性结构非常稳定,行为变化非常快。访问者模式就是将数据结构与行为进行解耦,这两个也能在不同的地方操作。
package com.weizhaoyang.visitor;
import java.util.List;
public class Demo {
private String name;
private String name1;
private List nameList;
public void access(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}
public List getNameList() {
return nameList;
}
public void setNameList(List nameList) {
this.nameList = nameList;
}
}
1、属性的操作是由访问者来操作的,访问者根据访问属性的特点做出相应的回答。demo这个人必须接受访问者,访问者才能来访问。提供一个access的方法:
2、在不同的环境里面,上面的demo类中有两个属性如果都要修改的话,然而每一次都会将demo进行修改,会有很多问题,如果有一个访问者的话,结构不变,行为会通过访问方法来动态的进行改变,就解决了很多环境的问题。
代码如下:1、新建一个访问者的接口:
package com.weizhaoyang.visitor;
import java.util.List;
public interface Visitor {
public void visitiorName( String name);
public void visitiorAge(String age);
public void visitiorEmp(List<String> listEmp);
public void visitiorFamily(List<String>listFamily);
}
2、创建一个被访问者:
package com.weizhaoyang.visitor;
import java.util.List;
/**
* 老板对象
*/
public class Boos {
/////////////////////////整体的结构
//名称
private String name;
//年龄
private String age;
//公司员工名称
private List<String> listEmp;
//访问家庭
private List<String> listFamily;
///////////////////访问者
private Visitor visitor;
public Boos(String name, String age, List<String> listEmp, List<String> listFamily) {
this.name = name;
this.age = age;
this.listEmp = listEmp;
this.listFamily = listFamily;
}
///////////////////接收访问者的方法
public void accpet(Visitor visitor){
this.visitor=visitor;
//授权
visitior();
}
//给访问者赋予权限
private void visitior(){
visitor.visitiorAge(age);
visitor.visitiorEmp(listEmp);
visitor.visitiorFamily(listFamily);
visitor.visitiorName(name);
}
}
具体的访问者的代码如下:
package com.weizhaoyang.visitor;
import java.util.List;
/**
* 具体的某一个访问者
*/
public class ImplVisitor implements Visitor {
@Override
public void visitiorName(String name) {
System.out.println("访问名称"+name);
}
@Override
public void visitiorAge(String age) {
System.out.println("访问年龄"+age);
}
@Override
public void visitiorEmp(List<String> listEmp) {
System.out.println("访问员工"+listEmp.size());
}
@Override
public void visitiorFamily(List<String> listFamily) {
System.out.println("访问家人"+listFamily.size());
}
}
测试类的代码如下:
package com.weizhaoyang.visitor;
import java.util.ArrayList;
public class VisitorTest {
public static void main(String[] args) {
//初始化老板
Boos boos=new Boos("魏朝阳","24",new ArrayList<String>(20000),new ArrayList<String>(20));
//创造访问者
Visitor visitor=new ImplVisitor();
//接收访问者
boos.accpet(visitor);
}
}
运行的结果如下:
总结:这就是将结构和行为进行解耦,把set方法和get方法进行一个屏蔽,当属性的变化非常平凡,而结构非常稳定,不想修改这个对象的时候,就可以用访问者模式来动态给这些属性进行操作。