栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

尚硅谷设计模式学习(16)---[访问者模式(Visitor Pattern)]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

尚硅谷设计模式学习(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 audienceList = new linkedList();

    //添加;
    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);
    }
}

执行

男观众评分--->通过
女观众评分--->通过
------------
男观众评分--->不通过

如果要扩展新的评分或者新的观众分类;不需要修改过多的代码.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号