设计模式 行为型模式 -- 访问者模式
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 访问者模式相关的知识,希望对你有一定的参考价值。
1. 访问者模式
1.1 引入
分析:
1.2 定义
1.3 结构
主要角色:
1.3.1 典型的抽象访问者类代码
1.3.2 典型的具体访问者类代码
1.3.3 典型的抽象元素类代码
1.3.4 典型的具体元素类代码
1.3.5 典型的对象结构代码
1.4 访问者模式实现原理: 双重分派机制
1.5【例】给宠物喂食
现在养宠物的人特别多,我们就以这个为例,当然宠物还分为狗,猫等,要给宠物喂食的话,主人可以喂,其他人也可以喂食。
角色分析:
- 抽象访问者角色:给宠物喂食的人
- 具体访问者角色:主人、其他人
- 抽象元素角色:动物抽象类
- 具体元素角色:宠物狗、宠物猫
- 结构对象角色:主人家
类图如下:
代码实现:
Person.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Person
* @Description: 抽象访问者角色类
*/
public interface Person {
//喂食宠物狗
void feed(Cat cat);
//喂食宠物猫
void feed(Dog dog);
}
Animal.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Animal
* @Description: 抽象元素角色类
*/
public interface Animal {
//接受访问者访问的功能
void accept(Person person);
}
Cat.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Cat
* @Description: 具体元素角色类(宠物猫)
*/
public class Cat implements Animal {
public void accept(Person person) {
person.feed(this); //访问者给宠物猫喂食
System.out.println("好好吃,喵喵喵。。。");
}
}
Dog.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Cat
* @Description: 具体元素角色类(宠物狗)
*/
public class Dog implements Animal {
public void accept(Person person) {
person.feed(this); //访问者给宠物猫喂食
System.out.println("好好吃,汪汪汪。。。");
}
}
Owner.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Owner
* @Description: 具体访问者角色类(主人)
*/
public class Owner implements Person {
public void feed(Cat cat) {
System.out.println("主人喂食猫");
}
public void feed(Dog dog) {
System.out.println("主人喂食狗");
}
}
Someone.java
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Owner
* @Description: 具体访问者角色类(其他人)
*/
public class Someone implements Person {
public void feed(Cat cat) {
System.out.println("其他人喂食猫");
}
public void feed(Dog dog) {
System.out.println("其他人喂食狗");
}
}
Home.java
package com.tian.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* @version v1.0
* @ClassName: Home
* @Description: 对象结构类
*/
public class Home {
//声明一个集合对象,用来存储元素对象
private List<Animal> animalList = new ArrayList<Animal>();
//添加元素功能
public void add(Animal animal) {
animalList.add(animal);
}
public void action(Person person) {
//遍历集合,获取每一个元素,让访问者访问每一个元素
for (Animal animal : animalList) {
animal.accept(person);
}
}
}
package com.tian.visitor;
/**
* @version v1.0
* @ClassName: Client
* @Description: 客户端类:测试类
*/
public class Client {
public static void main(String[] args) {
//创建Home对象
Home home = new Home();
//添加元素到Home对象中
home.add(new Dog());
home.add(new Cat());
//创建主人对象
Owner owner = new Owner();
//创建其他人对象
Someone someone = new Someone();
//让主人喂食所有的宠物
home.action(owner);
//让其他人喂食所有的宠物
home.action(someone);
}
}
1.5.1 运行结果
1.6 优缺点分析 适用场景
1.6.1 优点
1.6.2 缺点
适用场景
- 对象结构相对稳定,但其操作算法经常变化的程序。
- 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。
以上是关于设计模式 行为型模式 -- 访问者模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)