Visitor(访问者)示例

示例:

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

 

Java程序如下:

public interface LibraryVisitor {

    void visit(Book p_book);

    void visit(Article p_article);

    void printSum();

}

 

public class LibrarySumPrintVisitor implements LibraryVisitor {//打印总页数

 

    private int sum = 0;

    @Override

    public void visit(Book p_book) {

        sum = sum + p_book.getNumberOfPages();

    }

 

    @Override

    public void visit(Article p_article) {

        sum = sum + p_article.getNumberOfPages();

    }

   

    @Override

    public void printSum() {

        System.out.println("SUM="+sum);

 

    }

 

}

 

public interface LibraryItemInterface {

    void accept(LibraryVisitor visitor);

}

 

public 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(){

        return m_end_page - m_start_page;

    }

   

    public void accept(LibraryVisitor visitor) {

        visitor.visit(this);

    }

}

 

public 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) {

        visitor.visit(this);

    }

}

该示例来源于软件设计师教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
访问者模式是一种行为设计模式,它允许你定义一系列操作,而这些操作可以应用于某个对象结构的元素。通过这种方式,你可以在不改变各元素类的前提下,定义作用于这些元素的新操作。 在 Python 访问者模式通常由两个类组成:元素类和访问者类。元素类表示对象结构的元素,而访问者类则表示要对这些元素执行的操作。 下面是一个简单的示例代码: ```python class Element: def accept(self, visitor): pass class ConcreteElementA(Element): def accept(self, visitor): visitor.visit_concrete_element_a(self) class ConcreteElementB(Element): def accept(self, visitor): visitor.visit_concrete_element_b(self) class Visitor: def visit_concrete_element_a(self, element): pass def visit_concrete_element_b(self, element): pass class ConcreteVisitor1(Visitor): def visit_concrete_element_a(self, element): print("ConcreteVisitor1 visited ConcreteElementA") def visit_concrete_element_b(self, element): print("ConcreteVisitor1 visited ConcreteElementB") class ConcreteVisitor2(Visitor): def visit_concrete_element_a(self, element): print("ConcreteVisitor2 visited ConcreteElementA") def visit_concrete_element_b(self, element): print("ConcreteVisitor2 visited ConcreteElementB") elements = [ConcreteElementA(), ConcreteElementB()] visitors = [ConcreteVisitor1(), ConcreteVisitor2()] for element in elements: for visitor in visitors: element.accept(visitor) ``` 在上面的代码,我们定义了两个元素类 ConcreteElementA 和 ConcreteElementB,以及两个访问者类 ConcreteVisitor1 和 ConcreteVisitor2。元素类都实现了 accept 方法,该方法接受一个访问者对象作为参数,并调用该访问者对象的 visit 方法。访问者类则实现了 visit 方法,该方法接受一个元素对象作为参数,并对该元素对象执行相应的操作。 在主程序,我们创建了两个元素对象和两个访问者对象,并依次将每个元素对象传递给每个访问者对象的 visit 方法。这样,每个访问者对象都会对每个元素对象执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值