尚硅谷设计模式学习(16)---[访问者模式(Visitor Pattern)]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(16)---[访问者模式(Visitor Pattern)]相关的知识,希望对你有一定的参考价值。
尚硅谷传送门==>B站尚硅谷Java设计模式
❤❤❤感谢尚硅谷❤❤❤
最近开始计划学习一下设计模式了,加油!!!
由一个案例引入;
在一个表演结束后,由男观众与女观众分别对参赛选手打分;
通过;不通过;待定;
若是按这种传统模式设计的话,
增加观众分类或者添加新的评分类型时,就要修改比较多的地方;违反开闭原则.
那么来看看访问者模式
.
访问者模式
将数据结构与数据操作分离,在被访问的类里面加一个对外提供接待访问者的接口
访问者模式符合单一职责原则;提高了程序的扩展性、灵活性.
但是也有不足之处----->
具体元素对访问者公布细节(访问者关注其他类的内部细节);
访问者依赖的是具体元素,而不是抽象元素;
那么继续回到上面的案例,应用访问者模式.
评分抽象类
//评分
public abstract class RatingActions {
//男观众的评分-->;
public abstract void findMaleRating(MaleAudience maleAudience);
//女观众的评分-->;
public abstract void findFemaleRating(FemaleAudience femaleAudience);
}
通过;
//通过;
public class Pass extends RatingActions{
@Override
public void findMaleRating(MaleAudience maleAudience) {
System.out.println("男观众评分--->通过");
}
@Override
public void findFemaleRating(FemaleAudience femaleAudience) {
System.out.println("女观众评分--->通过");
}
}
不通过
//不通过;
public class NoPass extends RatingActions{
@Override
public void findMaleRating(MaleAudience maleAudience) {
System.out.println("男观众评分--->不通过");
}
@Override
public void findFemaleRating(FemaleAudience femaleAudience) {
System.out.println("女观众评分--->不通过");
}
}
观众
//观众;
public abstract class Audience {
//提供访问者---访问;
public abstract void accept(RatingActions ratingActions);
}
男观众
//男观众
public class MaleAudience extends Audience {
@Override
public void accept(RatingActions ratingActions) {
ratingActions.findMaleRating(this);
}
}
女观众
//女观众;
public class FemaleAudience extends Audience{
@Override
public void accept(RatingActions ratingActions) {
ratingActions.findFemaleRating(this);
}
}
在设计男观众,女观众的重写方法时,用到了双分派;
(1)先在客户端中,将具体评分状态作为参数传递到当前类;
(2)当前类调用了作为参数的具体方法;同时将自己的this(对象)作为参数传入;
数据结构
//数据结构;管理观众;
public class ObjectStructure {
//用集合来维护 -->聚合 Audience(观众) ;
private List<Audience> audienceList = new LinkedList<Audience>();
//添加;
public void toAdd(Audience audience){
audienceList.add(audience);
}
//删除;
public void toRemove(Audience audience){
audienceList.remove(audience);
}
//显示评分结果;
public void show(RatingActions ratingActions){
for (Audience audience : audienceList) {
audience.accept(ratingActions);
}
}
}
模拟客户端
//模拟客户端;
public class Client {
public static void main(String[] args) {
//创建数据结构;
ObjectStructure os = new ObjectStructure();
MaleAudience maleAudience = new MaleAudience();
FemaleAudience femaleAudience = new FemaleAudience();
//添加观众;
os.toAdd(maleAudience);
os.toAdd(femaleAudience);
//评分;
Pass pass = new Pass();
//显示评分;
os.show(pass);
System.out.println("------------");
//移出观众;
os.toRemove(femaleAudience);
NoPass noPass = new NoPass();
//评分;
os.show(noPass);
}
}
执行
男观众评分--->通过
女观众评分--->通过
------------
男观众评分--->不通过
如果要扩展新的评分或者新的观众分类;不需要修改过多的代码.
以上是关于尚硅谷设计模式学习(16)---[访问者模式(Visitor Pattern)]的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]