设计模式笔记————访问者模式

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

在这里插入图片描述

Visitor类,为该对象结构中ConcreteVisitor的每一个类声明一个Visit操作。访问者接口为使用不同算法的子类声明访问操作。

public abstract class Visitor {

	public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
	public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

ConcreteVisitor1和ConcreteVisitor2类,具体访问者。每个操作实现这种算法(1或2)的一部分。

public class ConcreteVisitor1 extends Visitor {

	@Override
	public void visitConcreteElementA(ConcreteElementA concreteElementA) {
		System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName() + "访问");
	}

	@Override
	public void visitConcreteElementB(ConcreteElementB concreteElementB) {
		System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName() + "访问");
	}
}

public class ConcreteVisitor1 extends Visitor {
	//代码与上类类似
}

Element类,定义一个accept操作接口,它以一个访问者为参数

public abstract class Element {

	public abstract void accept(Visitor visitor);
}

ConcreteElementA和ConcreteElementB类,具体元素,实现accept操作。

public class ConcreteElementA extends Element {

	@Override
	public void accept(Visitor visitor) {
		visitor.visitConcreteElementA(this);
	}

	public void OperationA(){} ---其它的相关方法
}

public class ConcreteElementB extends Element {

	@Override
	public void accept(Visitor visitor) {
		visitor.visitConcreteElementA(this);
	}

	public void OperationB(){} ---其它的相关方法
}

ObjectStructure类,能枚举它的元素,提供一个高层接口以允许访问者访问它的元素

public class ObjectStructure {

	private List<Element> elements = new ArrayList<>();
	
	public void addElement(Element element) {
		elements.add(element);
	}
	
	public void visit(Visitor visitor) {
		for (Element element : elements) {
			element.accept(visitor);
		}
	}
}

客户端代码

public static void main(String[] args) {
		ObjectStructure oStructure = new ObjectStructure();
		oStructure.addElement(new ConcreteElementA());
		oStructure.addElement(new ConcreteElementB());
		
		ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
		ConcreteVisitor2 visitor2 = new ConcreteVisitor2();
		
		oStructure.visit(visitor1);
		System.out.println("-------------------");
		oStructure.visit(visitor2);
	}


ConcreteElementA被ConcreteVisitor1访问
ConcreteElementB被ConcreteVisitor1访问
-------------------
ConcreteElementA被ConcreteVisitor2访问
ConcreteElementB被ConcreteVisitor2访问

举一个例子来理解该模式:人分为男人和女人,男人和女人在成功或恋爱时的反应不同。
这里人的属性男人和女人可以当成ConcreteElement
成功和恋爱或其它的状态可以当成ConcreteVisitor,它们去访问元素(男人或女人)的具体反应。

People抽象类

public abstract class Person {

	public abstract void accept(Action visitor);
}

状态抽象类

public abstract class Action {

	public abstract void getManConclusion(Person man);
	public abstract void getWomanConclusion(Person woman);
}

Man类和Woman类

public class Man extends Person {

	@Override
	public void accept(Action visitor) {
		// TODO Auto-generated method stub
		visitor.getManConclusion(this);
	}
}

public class Woman extends Person {

	@Override
	public void accept(Action visitor) {
		// TODO Auto-generated method stub
		visitor.getWomanConclusion(this);
	}
}

状态的子类,Success类(ConcreteVisitor),其余状态(恋爱等)和Success类代码类似不进行列举。

public class Success extends Action {

	@Override
	public void getManConclusion(Person man) {
		System.out.println(man.getClass().getSimpleName() + this.getClass().getSimpleName() + "高调");
	}

	@Override
	public void getWomanConclusion(Person woman) {
		System.out.println(woman.getClass().getSimpleName() + this.getClass().getSimpleName() + "低调");
	}
}

对象结构类

public class ObjectStructure {
	
	private List<Person> persons = new ArrayList<>();
	
	public void addPerson(Person person) {
		persons.add(person);
	}
	
	public void display(Action visitor) {
		for (Person person : persons) {
			person.accept(visitor);
		}
	}
}

客户端测试

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ObjectStructure oStructure = new ObjectStructure();
		oStructure.addPerson(new Man());
		oStructure.addPerson(new Woman());
		
		Success success = new Success();
		oStructure.display(success);
	}


ManSuccess高调
WomanSuccess低调

访问者模式的优缺点

  • 优点是增加新的操作很容易,增加一个新的操作相当于新增一个访问者。访问者模式将有关的行为集中到一个访问者身上。
  • 缺点是使增加新的数据结构变得困难。

访问者模式只适用于数据结构相对稳定的系统,例如上面的示例中人只分为男人和女人两个类型,如果能有多个性别,“状态”类中的抽象方法就不可能稳定,每增加一个类别,就需要在状态类和它的下属类中都增加一个方法。

访问者模式把数据结构和作用于结构之上的操作之间的耦合解开,使得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来,如果系统有稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是合适的,访问者模式使算法操作的增加变得容易。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FPGA自学笔记——设计与验证JMB FPGA(可编程逻辑门阵列)是一种可编程的硬件平台,可以实现各种数字电路的设计与验证。本文将简要介绍使用FPGA自学设计与验证JMB(低功耗、高效能、集成度高的多媒体芯片)的过程。 首先,我们需要了解JMB的功能和特性。JMB是一种面向多媒体应用的芯片,具备低功耗、高效能和高集成度的优势。我们需要详细研究JMB的硬件架构和内部模块,包括处理器核、存储器模块、图像和音频处理模块等。 接下来,我们可以使用FPGA开发板来设计和验证JMB。首先,我们需要熟悉FPGA设计工具,例如Vivado或Quartus等。这些工具提供了图形化界面和硬件描述语言(HDL)等设计方法。我们可以使用HDL编写JMB的功能模块,并将其综合为FPGA可执行的位流文件。 在设计完成后,我们需要验证JMB的功能和性能。我们可以使用仿真工具(例如ModelSim或ISE Simulator)来模拟JMB在不同情况下的行为。通过设计测试程序并运行仿真,我们可以验证JMB的各个模块是否正确地工作,是否满足设计要求。 在验证完成后,我们可以将位流文件下载到FPGA开发板中进行智能芯片的物理实现和测试。通过与外部设备的连接以及相关测试程序的运行,我们可以验证JMB在实际硬件中的功能和性能。 总结起来,学习FPGA设计与验证JMB,我们需要熟悉JMB的硬件架构和内部模块,并使用FPGA开发工具进行设计与验证。通过仿真和物理实现测试,我们可以验证JMB的功能和性能。这些过程需要理论知识和实践经验的结合,希望这些笔记能够给你提供一些参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值