Java设计模式-访问者模式

文章目录

背景

最近一直在深入剖析古铁的构造,甚至连骨头都不放过。谁叫古铁那么受欢迎呢?今天也不例外,来看看古铁的设计思想,就会明白古铁为什么这么强!在这里,我给大家灌输一波鸡汤,正所谓:成大事者不拘小节。成功的人应当把时间和精力花在对自己最重要的事情上,而不是为了一些鸡毛蒜皮的小事浪费时间。
古铁的主要工作是行动、攻击,维修这种非本职工作一般是外包给别人干的,只需要提供一个访问的接口,让别人来帮古铁维修,具体实现细节如下。

实现

机体抽象类

/**
 * 机体抽象类
 */
public abstract class Robot {
	
	private String name;

	/**
	 * 攻击是机体自己做的事情
	 */
	abstract void attack();

	/**
	 * 维修是别人帮忙做的事情
	 * 
	 * @param visitor 交给维修人员(访问者)来做
	 */
	abstract void repair(IVisitor visitor);

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

古铁

/**
 * 又是我们的古铁..
 */
public class AncientIron extends Robot {

	@Override
	void attack() {
		System.out.println("自己操纵古铁还是非常有乐趣的,左轮打桩机!");
	}

	@Override
	void repair(IVisitor visitor) {
		visitor.visit(this);
	}

}

访问者接口

public interface IVisitor {

	/**
	 * 访问机体的功能
	 */
	void visit(Robot robot);
}

维修人员

public class RobotRepairer implements IVisitor {

	@Override
	public void visit(Robot robot) {
		System.out.println(robot.getName() + ",你好!所谓成大事者不拘小节,维修这种事情还是让我们修理工做吧!");
	}

}

测试

public class Test {

	public static void main(String[] args) {
		IVisitor repairer = new RobotRepairer();

		Robot ancientIron = new AncientIron();
		ancientIron.setName("古铁");
		ancientIron.attack();
		ancientIron.repair(repairer);
	}
}

测试结果

自己操纵古铁还是非常有乐趣的,左轮打桩机!
古铁,你好!所谓成大事者不拘小节,维修这种事情还是让我们修理工做吧!

总结

访问者模式有很明显的优点,就是遵循了单一职责原则,假设一个类里面有一些非本职工作的方法,那么可以考虑把这些方法交给访问者去实现。那么,以后如果实现的逻辑有变化,只需要改变访问者,而无需对这个类做太大的改变。

猜你喜欢

转载自blog.csdn.net/cblstc/article/details/93708835