访问者模式类图与代码

某图书管理系统中管理着两种类型的文献:图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本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.getNumberOfPages;
    }
    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 int m_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_start_page = p_start_page;
        m_end_page = p_end_page;
    }

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

    public void accept(Libraryvisitor visitor) { // 接收一个访问者,统计Book的页数
        visitor.visit(this); 
    }
}

class Book implements LibraryItemInterface {
    private String m_title; //书名
    private String m_author;//书作者
    private int m_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) { // 接收一个访问者,统计Article的页数
        visitor.visit(this);
    }
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值