zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 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
  • 相关阅读:
    页面转表格并且下载
    关于表格导入
    C/C++作用域运算符::
    设计模式之观察者模式_C++
    C# 传不定参数
    C语言中的位域的使用
    C++/python求哈希值(SHA256)
    C++中纯虚函数
    类模板/函数模板实现父类指针指向子类对象(虚函数实现多态)
    Windows Socket 接口简介
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/12433638.html
Copyright © 2011-2022 走看看