访问者模式
意图:主要将数据结构与数据操作分离。
写一个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 {@Overridepublic void visitiorName(String name) {System.out.println("访问名称"+name);}@Overridepublic void visitiorAge(String age) {System.out.println("访问年龄"+age);}@Overridepublic void visitiorEmp(List<String> listEmp) {System.out.println("访问员工"+listEmp.size());}@Overridepublic 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方法进行一个屏蔽,当属性的变化非常平凡,而结构非常稳定,不想修改这个对象的时候,就可以用访问者模式来动态给这些属性进行操作。