访问者模式(由浅到深学习设计模式)

访问者模式


  1. 概述

访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

  1. 应用场景(何时使用)

1、需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决
2、如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的

  1. 实例讲解
测评系统:
将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的
评价(评价 有不同的种类,比如 成功、失败 等)

在这里插入图片描述

步骤如下:
1)	定义Person抽象类让子类继承,提供一个方法,让访问者可以访问
2)  定义Action抽象类让子类继承,提供测评方法
3)	定义ObjectStructure维护Person集合,响应方法
4)  客户端调用

在这里插入图片描述

Person类

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public abstract class Person {

	//提供一个方法,让访问者可以访问
	public abstract void accept(Action action);
}

Man类

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public class Man extends Person {

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

}

Woman大同小异

Action类

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public abstract class Action {

	//得到男性 的测评
	public abstract void getManResult(Man man);

	//得到女的 测评
	public abstract void getWomanResult(Woman woman);
}

Success类

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public class Success extends Action {

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println(" 男人给的评价该歌手很成功 !");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println(" 女人给的评价该歌手很成功 !");
	}

}

Wait、Fail大同小异

ObjectStructure类

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public class ObjectStructure {

	//维护了一个集合
	private List<Person> persons = new LinkedList<>();

	//增加到list
	public void attach(Person p) {
		persons.add(p);
	}
	//移除
	public void detach(Person p) {
		persons.remove(p);
	}

	//显示测评情况
	public void display(Action action) {
		for(Person p: persons) {
			p.accept(action);
		}
	}
}

客户端调用

/**
 * @author 漆剑
 * @date 2021-03-27
 * @description
 */
public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建ObjectStructure
		ObjectStructure objectStructure = new ObjectStructure();

		objectStructure.attach(new Man());
		objectStructure.attach(new Woman());


		//成功
		Success success = new Success();
		objectStructure.display(success);

		System.out.println("===============");
		Fail fail = new Fail();
		objectStructure.display(fail);

		System.out.println("=======给的是待定的测评========");

		Wait wait = new Wait();
		objectStructure.display(wait);
	}

}
  1. 总结
  1. 访问者模式符合单一职责原则、让程序具有优秀的扩展性、灵活性非常高
  2. 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统
  3. 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的, 这样造成了具体元素变更比较困难
  4. 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素
  5. 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的.

由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值