访问者模式类图与代码

发布于:2024-04-15 ⋅ 阅读:(163) ⋅ 点赞:(0)

某图书管理系统中管理着两种类型的文献:图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文,那么馆藏文献的总页码就是590页)。采用Visitor(访问者)模式实现该要求,得到如图7.16所示的类图。

访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

【Java 代码】

import java.util.*;

interface Libraryvisitor {
    void visit(Book p_book); //访问Book

    void visit(Article p_article);//访问 Article

    void printSum();
}

class LibrarysumPrintvisitor implements Libraryvisitor {//打印总页数
    private int sum = 0;

    public void visit(Book p_book) {
        sum = sum + P_book.getNumberOfPages();
        public void visit (Article p_article){
            sum = sum + p_article.getNumberOfPages0;
        }
        public void printsum () {
            System.out.println("SUM=" + sum);
        }
    }

    interface libraryItemInterface {
        void accept(LibraryVisitor visitor); // 声明了一个接受操作,接受一个访问者对象
    }

    class Article implements libraryItemInterface {
        private String m_title; //论文名
        private String m_author; //论文作者
        private intm_start_page;
        private int m_end_page;

        public Article(String p_author, string p_title, int p_start_page, int
                p_end_page) {
            m title = p title;
            m_author = p_author;
            m_end_page = p_end_page;
        }

        public int qetNumbelOfPages() {
            rctum m_end_page -m_start_page;
        }

        public void accept(Libraryvisitor visitor) {
            visitor.visit(this); // 该访问者的具体实现
        }
    }

    class Book implements LibraryItemInterface {
        private String m_title; //书名
        private String m_author;//书作者
        private intm_pages;//页教

        public Book(String p_author, String p_title, int p_ pages) {
            m_title = p_title;
            m_author = p_author;
            m_pages = p_pages;
        }

        public int getNumberOfPages() {
            return m_pages;
        }

        public void accept(LibraryVisitor visitor) {
            visitor.visit(this);// 该访问者的具体实现
        }
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到