尚硅谷设计模式学习(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)]的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习---[装饰者模式]

尚硅谷设计模式学习---[单例模式]

尚硅谷设计模式学习---[桥接模式(Bridge)]

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

尚硅谷设计模式学习---[简单工厂模式,工厂方法模式,抽象工厂模式]

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]