设计模式:访问者模式

什么是访问者模式

访问者模式:对于存储在一个集合中的对象,它们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问方式也有所不同.

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

模式主要组成

  1. Visitor
  • 表示访问层的抽象类或者接口,用于定义每个元素中访问的行为,参数就是可以访问的元素,一般方法数量于元素数量一致.
  1. ConcreteVisitor
  • 表示具体的访问者,继承Visitor并对其声明的抽象方法提供具体的实现.
  1. Element
  • 表示元素的抽象类或者接口.即访问者实际要访问的对象,Element角色需要对访问者提供一个开发的接口.为了让每个元素都可以被访问者访问.
  1. ConreteElement
  • 表示具体的元素类,提供接受访问方法的具体实现,一般是使用访问者提供的访问该元素类的方法.
  1. ObjectStructure
  • 表示定义结构对象,对象结构是一个抽象表述,管理元素集合并可以迭代这些元素提供给访问者访问

访问者模式经典实例

visitor访问者接口:

//访问者接口
public interface ComputerPartVisitor {
	  public void visit(Computer computer);
	    public void visit(Mouse mouse);
	    public void visit(Keyboard keyboard);
	    public void visit(Monitor monitor);
}

ConcreteVisitor访问者接口的实现类

//具体的访问者
public class ComputerPartDisplayVisitor implements ComputerPartVisitor{
	 @Override
	    public void visit(Computer computer) {
	        System.out.println("Displaying Computer.");
	    }
	 
	    @Override
	    public void visit(Mouse mouse) {
	        System.out.println("Displaying Mouse.");
	    }
	 
	    @Override
	    public void visit(Keyboard keyboard) {
	        System.out.println("Displaying Keyboard.");
	    }
	 
	    @Override
	    public void visit(Monitor monitor) {
	        System.out.println("Displaying Monitor.");
	    }
}

Element被访问对象的接口

//元素接口
public interface ComputerPart {
	 public void accept(ComputerPartVisitor computerPartVisitor);
}

ConreteElement具体被访问对象的实现类

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

public class Keyboard implements ComputerPart{
	 @Override
	    public void accept(ComputerPartVisitor computerPartVisitor) {
	        computerPartVisitor.visit(this);
	    }

}
public class Monitor implements ComputerPart{
	 @Override
	    public void accept(ComputerPartVisitor computerPartVisitor) {
	        computerPartVisitor.visit(this);
	    }

}
public class Mouse implements ComputerPart{
	 @Override
	    public void accept(ComputerPartVisitor computerPartVisitor) {
	        computerPartVisitor.visit(this);
	    }

}

测试代码

public class Test {
	 public static void main(String[] args) {
		 
	        ComputerPart computer = new Computer();
	        computer.accept(new ComputerPartDisplayVisitor());
	    }
}

执行后:

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值