设计模式课程 设计模式精讲 26-2 访问者模式coding

1    代码演练

1.1  代码演练1

1    代码演练

1.1  代码演练1

需求:

木木网发布课程,有 付费课程 和免费课程。要设计出不同的游客访问不同课程看到的权限不同((其实领导不应该在visitor中,这里为了方便讲解)领导可以看到课程绩效,课程名字和课程价格,其他游客可以看到付费课程名字和价格以及免费课程的名字)

重点:(个人开发中没有注意到的地方)

1  核心:根据不同的Visitor对相同的数据产生不同的操作行为。

2  测试类中用的是 course.accept(new Visitor())  而不是 new Visitor().visior(Course); 之所以这样设计,就是为了防止领导 和 普通游客 访问课程出现冲突。参考核心(红线标注部分)。

uml类图:

 

测试类:

package com.geely.design.pattern.behavioral.visitor;

import java.util.ArrayList;
import java.util.List;

public class Test {

    @org.junit.Test
    public void Test(){
        CodingCourse course1 = new CodingCourse();
        FreeCourse course2 = new FreeCourse();
        course1.setCourseName("付费课程名字");
        course1.setPrice(88.88);
        course1.setJiXiao(9999.00);
        course2.setCourseName("免费课程名字");
        course2.setJiXiao(1000000.00);

        List<Course> courseList = new ArrayList<Course>();
        courseList.add(course1);
        courseList.add(course2);

        for(Course course: courseList){
            course.accept(new Visitor());
        }

        course2.accept(new LeaderVisitor());

    }

}

课程抽象类:

package com.geely.design.pattern.behavioral.visitor;

/**
 * 课程抽象类
 */
public abstract class Course {
    //课程名字 ,被子类所引用
    private String courseName;
    //课程
    private Double jiXiao;

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public Double getJiXiao() {
        return jiXiao;
    }

    public void setJiXiao(Double jiXiao) {
        this.jiXiao = jiXiao;
    }

    //注意,不想实现可以写成抽象方法
    public abstract void accept(IVisitor visitor);

}

免费课程类:

package com.geely.design.pattern.behavioral.visitor;

public class FreeCourse extends Course {
    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

收费课程类:

package com.geely.design.pattern.behavioral.visitor;

public class CodingCourse extends Course {
    private Double price;

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public void accept(IVisitor visitor) {
       visitor.visit(this);
    }
}

游客接口:

package com.geely.design.pattern.behavioral.visitor;

public interface IVisitor {
    void visit(CodingCourse course);
    void visit(FreeCourse course);
}

普通游客类:

package com.geely.design.pattern.behavioral.visitor;

public class Visitor implements IVisitor {
    @Override
    public void visit(CodingCourse course) {
        System.out.println("课程名字是"+course.getCourseName()+",课程价格是:"+course.getPrice());
    }

    @Override
    public void visit(FreeCourse course) {
        System.out.println("课程名字是"+course.getCourseName());
    }
}

领导游客类:

package com.geely.design.pattern.behavioral.visitor;

public class LeaderVisitor implements IVisitor {
    @Override
    public void visit(CodingCourse course) {
        System.out.println("课程名字是"+course.getCourseName()+",课程价格是:"+course.getPrice()+",课程绩效是:"+course.getJiXiao());
    }

    @Override
    public void visit(FreeCourse course) {
        System.out.println("课程名字是"+course.getCourseName()+",课程绩效是:"+course.getJiXiao());
    }
}

打印日志:

课程名字是付费课程名字,课程价格是:88.88
课程名字是免费课程名字
课程名字是免费课程名字,课程绩效是:1000000.0

Process finished with exit code 0
原文地址:https://www.cnblogs.com/1446358788-qq/p/12433638.html