在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更。访问者模式提供了一种解决方法:将更新封装到一个子类中,并有待更改类提供一个接受接口,则可达到效果。
目录
一、模式初识
1.什么是访问者模式?
表示一个作用于某对象结构中的各元素的操作。它使你可以不改变各元素类的前提下定义作用于这些元素的新操作。
2.访问者模式如何完成?
访问者模式完成的是双重分派过程:具体元素类的accept方法被调用,并将访问者对象本身传入;具体元素类调用访问者的访问方法,并将具体访问类对象本身传入。
3.访问者模式的目的
访问者模式的目的是把处理从数据结构分离出来
二、模式深入
1.使用场景
访问者模式仅应当在被访问的类结构非常稳定的情况下使用
2.访问者模式提供了一种倾斜的可扩展设计
3.访问者模式的优缺点
优点:
①.访问者模式使得增加新的操作变得很容易。
②.访问者模式将有关的行为集中到一个访问者对象,而不是集中到一个个的节点类中。
缺点:
①.增加新的节点类变得很困难。
②.破坏封装。节点对象必须暴露一些自己的操作和内部状态
4.访问者模式本质:预留通路,回调实现
三、模式实例
通过访问者模式完成扩展用户管理的功能(java)
package a01a;
public interface Visitor {
public abstract void VisitServiceApplication(ServiceApplication sa);
public abstract void VisitValueAnalysis(ValueAnalysis va);
public abstract void VisitPreferenceAnalysis(PreferenceAnalysis pa);
}
package a01a;
public class IndividualUsers implements Visitor {
@Override
public void VisitServiceApplication(ServiceApplication sa) {
// TODO Auto-generated method stub
System.out.println("个人客户提出服务申请");
}
@Override
public void VisitValueAnalysis(ValueAnalysis va) {
// TODO Auto-generated method stub
System.out.println("个人客户进行客户价值分析");
}
@Override
public void VisitPreferenceAnalysis(PreferenceAnalysis pa) {
// TODO Auto-generated method stub
System.out.println("个人客户进行偏好分析");
}
}
package a01a;
public class EnterpriseUsers implements Visitor {
@Override
public void VisitServiceApplication(ServiceApplication sa) {
// TODO Auto-generated method stub
System.out.println("企业客户提出服务申请");
}
@Override
public void VisitValueAnalysis(ValueAnalysis va) {
// TODO Auto-generated method stub
System.out.println("企业客户进行客户价值分析");
}
@Override
public void VisitPreferenceAnalysis(PreferenceAnalysis pa) {
// TODO Auto-generated method stub
System.out.println("企业客户进行偏好分析");
}
}
package a01a;
public interface Element {
public abstract void Accept(Visitor visit);
}
package a01a;
public class PreferenceAnalysis implements Element {
@Override
public void Accept(Visitor visit) {
// TODO Auto-generated method stub
visit.VisitPreferenceAnalysis(this);
}
public void Operation() {
}
}
package a01a;
public class ValueAnalysis implements Element {
@Override
public void Accept(Visitor visit) {
// TODO Auto-generated method stub
visit.VisitValueAnalysis(this);
}
public void Operation() {
}
}
package a01a;
public class ServiceApplication implements Element {
@Override
public void Accept(Visitor visit) {
// TODO Auto-generated method stub
visit.VisitServiceApplication(this);
}
public void Operation() {
}
}
package a01a;
import java.util.ArrayList;
import java.util.List;
public class ObjectStructure {
private List<Element> elements=new ArrayList<Element>();
public void Attach(Element ele) {
elements.add(ele);
}
public void Detach(Element ele) {
elements.remove(ele);
}
public void Accept(Visitor visitor) {
for(Element element:elements) {
element.Accept(visitor);
}
}
}
package a01a;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectStructure o=new ObjectStructure();
o.Attach(new ServiceApplication());
o.Attach(new ValueAnalysis());
o.Attach(new PreferenceAnalysis());
IndividualUsers i1=new IndividualUsers();
EnterpriseUsers i2=new EnterpriseUsers();
o.Accept(i1);
o.Accept(i2);
}
}