1.概念
访问者模式实现数据和操作分离,通过访问者对目标对象进行修改。
基本实现:访问者包含访问方法,参数为被访问的对象,目标对象应该包含接收方法,接收访问对象。
2.go实现
package alian
import "fmt"
type Visitor interface {
visit (mouse *Mouse)
visit1 (keyBoard *KeyBoard)
visit2 (monitor *Monitor)
visit3 (computer *Computer)
}
type RealVisitor struct {
}
func (this * RealVisitor) visit (mouse *Mouse){
fmt.Println("mouse../" , mouse)
}
func (this * RealVisitor) visit1 (keyBoard *KeyBoard){
fmt.Println("KeyBoard../" , keyBoard)
}
func (this * RealVisitor) visit2 (monitor *Monitor){
fmt.Println("Monitor../" , monitor)
}
func (this * RealVisitor) visit3 (computer *Computer){
fmt.Println("Computer../" , computer)
}
type ComputerPart interface {
Accept(visitor *Visitor)
}
type Mouse struct {
}
func (this * Mouse) Accept(visitor *Visitor){
(*visitor).visit(this)
}
type KeyBoard struct {
}
func (this * KeyBoard) Accept(visitor *Visitor){
(*visitor).visit1(this)
}
type Monitor struct {
}
func (this * Monitor) Accept(visitor *Visitor){
(*visitor).visit2(this)
}
type Computer struct {
Parts []ComputerPart
}
func (this * Computer) Accept(visitor *Visitor){
for i := range this.Parts{
this.Parts[i].Accept(visitor)
}
(*visitor).visit3(this)
}
package alian
import "testing"
func Test_Visitor(t *testing.T) {
var visitor Visitor
visitor = &RealVisitor{}
mouse := Mouse{}
mouse.Accept(&visitor)
}
3.java实现
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:25
**/
package alian.visitor;
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:26
**/
package alian.visitor;
public class Computer implements ComputerPart{
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:26
**/
package alian.visitor;
public class Keyboard implements ComputerPart{
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:26
**/
package alian.visitor;
public class Monitor implements ComputerPart{
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:26
**/
package alian.visitor;
public class Mouse implements ComputerPart{
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:25
**/
package alian.visitor;
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-04-01 22:25
**/
package alian.visitor;
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
/**
* @program: demo
* @author: alian
* @description: \
* @create: 2023-04-01 22:35
**/
package alian.visitor;
import java.io.Console;
public class Main {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
// ComputerPart mouse = new Mouse();
// mouse.accept(new ComputerPartDisplayVisitor());
}
}