设计模式--访问者模式

  在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更。访问者模式提供了一种解决方法:将更新封装到一个子类中,并有待更改类提供一个接受接口,则可达到效果。

目录

一、模式初识

1.什么是访问者模式?

2.访问者模式如何完成?

3.访问者模式的目的

二、模式深入

1.使用场景

2.访问者模式提供了一种倾斜的可扩展设计

3.访问者模式的优缺点

4.访问者模式本质:预留通路,回调实现

三、模式实例


一、模式初识

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);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值