设计模式之访问者模式(C# / JavaScript / PHP / Java / Python 演示代码)

  GoF定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

  在访问者模式中,使用了一个访问者类来改变元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据这个模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

  简单理解:一个应用的内部多个模块不变,但是可以接收外部的指令来改变应用的功能。

  1、C#代码演示:

class program
{
    static void Main(string[] args)
    {
        Console.WriteLine("系统执行:");
        Intergrator II = new Intergrator();
        II.Run();
        Console.WriteLine("系统接收访问者1的指令:");
        Visitor V1 = new Visitor1();
        II.Accept(V1);
        II.Run();
        Console.WriteLine("系统接收访问者2的指令:");
        Visitor V2 = new Visitor2();
        II.Accept(V2);
        II.Run();
    }
}

//定义受访者的结构
public abstract class Interviewee{
    private string CommandStr="";//命令
    public void Interviewss(string CommStr){
        CommandStr = CommStr;
    }
    public void UpdateCommand(string CommStr){
        CommandStr = CommStr;
    }

    public void Run(){
        Console.WriteLine("执行命令:{0}",CommandStr);
    }

    public abstract void Accept(Visitor V);
}

//受访者A
public class IntervieweeA : Interviewee {
    public override void Accept(Visitor V){
        V.VisitIntervieweeA(this);
    }
}

//受访者B
public class IntervieweeB : Interviewee
{
    public override void Accept(Visitor V){
        V.VisitIntervieweeB(this);
    }
}

//集成者:集成上面的两个被访问者
public class Intergrator{
    private IntervieweeA IA = new IntervieweeA();
    private IntervieweeB IB = new IntervieweeB();

    public Intergrator(){
        IA.UpdateCommand("执行初始化命令A");
        IB.UpdateCommand("执行初始化命令B");
    }

    public void Run(){
        IA.Run();
        IB.Run();
    }
    public void Accept(Visitor V){
        IA.Accept(V);
        IB.Accept(V);
    }
}

public interface Visitor{
    public void VisitIntervieweeA(IntervieweeA IA);
    public void VisitIntervieweeB(IntervieweeB IB);
}

public class Visitor1:Visitor{
    public void VisitIntervieweeA(IntervieweeA IA){
        IA.UpdateCommand("访问者1的新命令A");
    }
    public void VisitIntervieweeB(IntervieweeB IB){
        IB.UpdateCommand("访问者1的新命令B");
    }
}

public class Visitor2 : Visitor
{
    public void VisitIntervieweeA(IntervieweeA IA){
        IA.UpdateCommand("访问者2的新命令A");
    }
    public void VisitIntervieweeB(IntervieweeB IB){
        IB.UpdateCommand("访问者2的新命令B");
    }
}

  控制台的输出:

   2、JavaScript代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>访问者模式</title>
	</head>
	<body>
		<div id="demo"></div>
		<script>
			//定义被访问者的基础结构
			function Interviewee(){
				this.Command="";
				this.Run=function(){
					PrintInfo("执行命令:"+this.Command);
				};
				this.UpdateCommand=function(CommStr){
					this.Command=CommStr;
				};
				this.Accept=function(V){
					
				}				
			}
			//被访问者1
			var IntervieweeA =new Interviewee();
			IntervieweeA.Accept=function(V){
				V.VisitIntervieweeA(this);
			}
			//被访问者2			
			var IntervieweeB =new Interviewee();
			IntervieweeB.Accept=function(V){
				V.VisitIntervieweeA(this);
			}
			//集成者:集成上面的两个被访问者			
			function Integrator(){
				this.IntervieweeA=IntervieweeA;
				this.IntervieweeB=IntervieweeB;
				this.IntervieweeA.Command="执行初始化命令A";
				this.IntervieweeB.Command="执行初始化命令B";
				this.Run=function(){
					this.IntervieweeA.Run();
					this.IntervieweeB.Run();
				};
				this.Accept=function(V){
					this.IntervieweeA.Accept(V);
					this.IntervieweeB.Accept(V);
				}
			}
			//定义访问者的结构
			function Visitor(){
				this.VisitIntervieweeA=function(){};
				this.VisitIntervieweeB=function(){};
			}
			//定义访问者1
			var Visitor1=new Visitor();
			Visitor1.VisitIntervieweeA=function(IA){
					IA.UpdateCommand("访问者1的新命令A");
			}
			Visitor1.VisitIntervieweeB=function(IB){
					IB.UpdateCommand("访问者1的新命令B");
			}
			//定义访问者2			
			var Visitor2=new Visitor();
			Visitor2.VisitIntervieweeA=function(IA){
					IA.UpdateCommand("访问者2的新命令A");
			Visitor2.VisitIntervieweeB=function(IB){
			}
					IB.UpdateCommand("访问者2的新命令B");
			}
			
			function PrintInfo(Str){
				document.getElementById("demo").innerHTML = document.getElementById("demo").innerHTML + Str+"<br>";
			}
			
			PrintInfo("系统执行:");
			II=new Integrator();
			II.Run();

			PrintInfo("系统接收访问者1的指令:");
			II=new Integrator(Visitor1);
			II.Run();

			PrintInfo("系统接收访问者2的指令:");
			II=new Integrator(Visitor2);
			II.Run();			
		</script>
	</body>
</html>

  网页里的输出:

系统执行:
执行命令:执行初始化命令A
执行命令:执行初始化命令B
系统接收访问者1的指令:
执行命令:执行初始化命令A
执行命令:执行初始化命令B
系统接收访问者2的指令:
执行命令:执行初始化命令A
执行命令:执行初始化命令B

  3、PHP代码演示:

<?php
	//定义被访问者的基础结构
	abstract class Interviewee{
		private $Command;//命令
		function __construct($Command){//初始化:接收命令
			$this->Command=$Command;
		}
		function Run(){//执行内部方法
			echo "执行命令:".$this->Command."<br>";
		}
		function UpdateCommand($Command){//更新命令
			$this->Command=$Command;
		}
		abstract function Accept(Visitor $V);//定义接收访问者的动作
	}

	class IntervieweeA extends Interviewee{
		function Accept(Visitor $V){
			$V->VisitIntervieweeA($this);//将自己交给访问者来访问
		}
	}

	class IntervieweeB extends Interviewee{
		function Accept(Visitor $V){
			$V->VisitIntervieweeB($this);//将自己交给访问者来访问
		}
	}

	class Integrator{//集成者:集成上述两个被访问者
		private $IntervieweeA;
		private $IntervieweeB;
		function __construct(){
			$this->IntervieweeA=new IntervieweeA("执行初始化命令A");
			$this->IntervieweeB=new IntervieweeB("执行初始化命令B");			
		}
		function Run(){
			$this->IntervieweeA->Run();
			$this->IntervieweeB->Run();
		}
		function Accept(Visitor $V){
			$this->IntervieweeA->Accept($V);
			$this->IntervieweeB->Accept($V);			
		}
	}
	
	interface Visitor{
		function VisitIntervieweeA(IntervieweeA $IA);
		function VisitIntervieweeB(IntervieweeB $IB);		
	}

	class Visitor1 implements Visitor{
		function VisitIntervieweeA(IntervieweeA $IA){
			$IA->UpdateCommand("访问者1的新命令A");
		}
		function VisitIntervieweeB(IntervieweeB $IB){
			$IB->UpdateCommand("访问者1的新命令B");			
		}		
	}

	class Visitor2 implements Visitor{
		function VisitIntervieweeA(IntervieweeA $IA){
			$IA->UpdateCommand("访问者2的新命令A");
		}
		function VisitIntervieweeB(IntervieweeB $IB){
			$IB->UpdateCommand("访问者2的新命令B");			
		}		
	}
	
	echo "系统执行:<br>";
	$I=new Integrator;
	$I->Run();
	echo "<br>";
	echo "系统接收访问者1的指令:<br>";
	$V1=new Visitor1;
	$I->Accept($V1);
	$I->Run();
	echo "<br>";
	echo "系统接收访问者2的指令:<br>";
	$V2=new Visitor2;
	$I->Accept($V2);
	$I->Run();
?>

  网页里的输出:

系统执行:
执行命令:执行初始化命令A
执行命令:执行初始化命令B

系统接收访问者1的指令:
执行命令:访问者1的新命令A
执行命令:访问者1的新命令B

系统接收访问者2的指令:
执行命令:访问者2的新命令A
执行命令:访问者2的新命令B

  4、Java代码演示:

class DesignModeVistor {
	public static void main(String[] args) {
        System.out.println("系统执行:");
        Intergrator II = new Intergrator();
        II.Run();

        System.out.println("系统接收访问者1的指令:");		
        Visitor V1 = new Visitor1();
        II.Accept(V1);
        II.Run();
		
        System.out.println("系统接收访问者2的指令:");
        Visitor V2 = new Visitor2();
        II.Accept(V2);
        II.Run();
	}
}

//定义受访者的抽象类
abstract class Interviewee{
	protected String CommandStr="";//指令

	public void UpdateCommand(String CommStr){
		this.CommandStr=CommStr;
	}
	
	public void Run(){
		System.out.println("执行命令:" + this.CommandStr);
	}
	
	public abstract void Accept(Visitor V);
}

//受访问者A
class IntervieweeA extends Interviewee {
	public IntervieweeA(String CommStr){
		super.CommandStr=CommStr;
	}
	
	public void Accept(Visitor V){
		V.VisitIntervieweeA(this);
	}
}

class IntervieweeB extends Interviewee {
	public IntervieweeB(String CommStr){
		super.CommandStr=CommStr;
	}
	public void Accept(Visitor V){
		V.VisitIntervieweeB(this);
	}
}

//集成者:集成受访问者A和受访问者B
class Intergrator{
	private IntervieweeA IA = new IntervieweeA("");
	private IntervieweeB IB = new IntervieweeB("");
	public Intergrator(){
		IA.UpdateCommand("执行初始化命令A");
		IB.UpdateCommand("执行初始化命令B");
	}
	
	public void Run(){
		IA.Run();
		IB.Run();
	}
	
	public void Accept(Visitor V){
		IA.Accept(V);
		IB.Accept(V);
	}
}

interface Visitor{
	public void VisitIntervieweeA(IntervieweeA IA);
	public void VisitIntervieweeB(IntervieweeB IB);
}

class Visitor1 implements Visitor{
    public void VisitIntervieweeA(IntervieweeA IA){
        IA.UpdateCommand("访问者1的新命令A");
    }
    public void VisitIntervieweeB(IntervieweeB IB){
        IB.UpdateCommand("访问者1的新命令B");
    }	
}

class Visitor2 implements Visitor
{
    public void VisitIntervieweeA(IntervieweeA IA){
        IA.UpdateCommand("访问者2的新命令A");
    }
    public void VisitIntervieweeB(IntervieweeB IB){
        IB.UpdateCommand("访问者2的新命令B");
    }
}

  输出:

G:\Java>javac DesignModeVistor.java

G:\Java>java DesignModeVistor
系统执行:
执行命令:执行初始化命令A
执行命令:执行初始化命令B
系统接收访问者1的指令:
执行命令:访问者1的新命令A
执行命令:访问者1的新命令B
系统接收访问者2的指令:
执行命令:访问者2的新命令A
执行命令:访问者2的新命令B

  5、Python代码演示:

import abc #利用abc模块实现抽象类

class InterViewee(metaclass=abc.ABCMeta):
    def __init__(self,command):
        self.command=command
    def run(self):
        print("执行命令:{}".format(self.command))
    def changecommand(self,command):
        self.command=command
    @abc.abstractmethod  # 定义抽象方法,不需要写具体的实现内容
    def accept(self,v):  # 接收访问者
        pass

class IntervieweeA(InterViewee):
    def accept(self,v):
        mine=self
        v.VisitIntervieweeA(mine)

class IntervieweeB(InterViewee):
    def accept(self,v):
        mine=self
        v.VisitIntervieweeB(mine)

class Integrator:
    def __init__(self):
        self.IntervieweeAAA=IntervieweeA("执行初始化命令A")
        self.IntervieweeBBB=IntervieweeB("执行初始化命令B")
    def run(self):
        self.IntervieweeAAA.run()
        self.IntervieweeBBB.run()
    def accept(self,v):
        self.IntervieweeAAA.accept(v)
        self.IntervieweeBBB.accept(v)

class Visitor:
    @abc.abstractmethod  # 定义抽象方法,不需要写具体的实现内容
    def VisitIntervieweeA(self,ia):
        pass

    @abc.abstractmethod  # 定义抽象方法,不需要写具体的实现内容
    def VisitIntervieweeB(self,ib):
        pass

class Visitor1(Visitor):
    def VisitIntervieweeA(self,ia):
        ia.changecommand("访问者1的新命令A")
    def VisitIntervieweeB(self,ib):
        ib.changecommand("访问者1的新命令B")

class Visitor2(Visitor):
    def VisitIntervieweeA(self,ia):
        ia.changecommand("访问者2的新命令A")
    def VisitIntervieweeB(self,ib):
        ib.changecommand("访问者2的新命令B")

print("系统执行:")
III=Integrator()
III.run()
print("系统接收访问者1的指令:")
v1=Visitor1()
III.accept(v1)
III.run()
print("系统接收访问者2的指令:")
V2=Visitor2()
III.accept(V2)
III.run()

  输出:

系统执行:
执行命令:执行初始化命令A
执行命令:执行初始化命令B
系统接收访问者1的指令:
执行命令:访问者1的新命令A
执行命令:访问者1的新命令B
系统接收访问者2的指令:
执行命令:访问者2的新命令A
执行命令:访问者2的新命令B

  2022年6月22日第一次更新:加入Java演示代码

  2022年6月30日第二次更新:加入Python演示代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值