文章目录
- 0 设计模式
- 1 访问者模式
- 2 实现思路
- 3 需要的类
- 4 具体实现
- 4.1 FruitPart(实体类的抽象)
- 4.2 FruitPart的实现类
- 4.2.1 Apple
- 4.2.2 Banana
- 4.2.3 WaterMelon
- 4.3 Fruit(聚合了多种具体实体的类)
- 4.4 Visitor(访问者接口)
- 4.5 具体访问者
- 4.5.1 PersonalVisitor
- 4.5.2 WholesalerVisitor
- 4.6 测试类
- 5 扩展
- 6 思维导图
- 7 示例源码地址
- 最后
0 设计模式
不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式
https://blog.csdn.net/qq_42874315/article/details/120006447?spm=1001.2014.3001.5502
1 访问者模式
访问者模式:就是面向不同的访问者,调用相同的动作,产生不同的结果。它可以在结构不变的情况下动态改变对于内部元素的动作。在结构不变的情况下动态的去改变对于内部元素的动作。
需要注意:如果对象经常变化的话,修改过程会非常复杂。
使用场景:
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。
2 实现思路
场景为批发水果,访问者分为个体户和经销商,他们批发水果得到的折扣肯定是不一样的
- 创建一个定义接受操作的 FruitPart 接口。Apple、Banana、Watermelon是FruitPart 接口的实体类。
- 定义另一个接口Visitor,它定义了访问者类的操作。
- 定义一个Fruit类来聚合三种具体的实现类(方便调用)。
- Fruit使用实体访问者来执行相应的动作。
3 需要的类
-
实体类的抽象类
-
实体类
-
面向的类
聚合了多种具体实体类,面向这个类进行调用
-
访问者接口
-
具体访问者
实现Visitor接口,编写一些自己的属性逻辑,实现三个具体的方法,在这里进行对不同访问者的不同操作
-
测试类
4 具体实现
4.1 FruitPart(实体类的抽象)
1
2
3
4
5
6
7
8
9
10/** * 水果抽象类 * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:06 */ public abstract class FruitPart { abstract void accept(Visitor visitor); abstract double getPrice(); }
4.2 FruitPart的实现类
4.2.1 Apple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:08 */ public class Apple extends FruitPart { @Override void accept(Visitor visitor) { visitor.visitApple(this); } @Override double getPrice() { return 5.00; } }
4.2.2 Banana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:08 */ public class Banana extends FruitPart { @Override void accept(Visitor visitor) { visitor.visitBanana(this); } @Override double getPrice() { return 15.00; } }
4.2.3 WaterMelon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:08 */ public class Watermelon extends FruitPart { @Override void accept(Visitor visitor) { visitor.visitWatermelon(this); } @Override double getPrice() { return 50.00; } }
4.3 Fruit(聚合了多种具体实体的类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:09 */ public class Fruit{ private FruitPart banana = new Banana(); private FruitPart apple = new Apple(); private FruitPart watermelon = new Watermelon(); public void accept(Visitor visitor){ banana.accept(visitor); apple.accept(visitor); watermelon.accept(visitor); } }
4.4 Visitor(访问者接口)
1
2
3
4
5
6
7
8
9
10/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:07 */ public interface Visitor { void visitBanana(Banana banana); void visitApple(Apple apple); void visitWatermelon(Watermelon watermelon); }
4.5 具体访问者
4.5.1 PersonalVisitor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:12 */ public class PersonalVisitor implements Visitor{ double totalPrice = 0.0; @Override public void visitBanana(Banana banana) { totalPrice += banana.getPrice(); } @Override public void visitApple(Apple apple) { totalPrice += apple.getPrice(); } @Override public void visitWatermelon(Watermelon watermelon) { totalPrice += watermelon.getPrice(); } }
4.5.2 WholesalerVisitor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:12 */ public class WholesalerVisitor implements Visitor{ double totalPrice = 0.0; @Override public void visitBanana(Banana banana) { totalPrice += banana.getPrice() * 0.7; } @Override public void visitApple(Apple apple) { totalPrice += apple.getPrice() * 0.7; } @Override public void visitWatermelon(Watermelon watermelon) { totalPrice += watermelon.getPrice() * 0.7; } }
4.6 测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/** * @Author ChenJiahao(程序员五条) * @Date 2021/8/1 20:16 */ public class Test { public static void main(String[] args) { // 个人原价 70 PersonalVisitor personalVisitor = new PersonalVisitor(); new Fruit().accept(personalVisitor); System.out.println(personalVisitor.totalPrice); // 商户七折 49 WholesalerVisitor wholesalerVisitor = new WholesalerVisitor(); new Fruit().accept(wholesalerVisitor); System.out.println(wholesalerVisitor.totalPrice); } }
5 扩展
可以使用访问者模式+工厂模式
将面向调用的类工厂化,这样就可以更加灵活的去控制生产了
6 思维导图
7 示例源码地址
https://github.com/ChenJiahao0205/design-pattern/tree/master
最后
我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同
想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看
在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路
感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条!
最后
以上就是自信滑板最近收集整理的关于【学习笔记】设计模式-访问者模式(Visitor)0 设计模式1 访问者模式2 实现思路3 需要的类4 具体实现5 扩展6 思维导图7 示例源码地址最后的全部内容,更多相关【学习笔记】设计模式-访问者模式(Visitor)0内容请搜索靠谱客的其他文章。
发表评论 取消回复