11.29

软件设计                  石家庄铁道大学信息学院

 

实验 25:访问者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解访问者模式的动机,掌握该模式的结构;

2、能够利用访问者模式法解决实际问题。

 
   

 

 

[实验任务一]:打包员

在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。

实验要求:

1. 

 
   


画出对应的类图;

 

2.  提交源代码;

package rjsj.no25;

 

public class Client {

 

    public static void main(String[] args) {

        Product b1 = new Book();

        Product a1 = new Apple();

        Visitor visitor;

       

        BuyBasket basket = new BuyBasket();

        basket.addProduct(b1);

        basket.addProduct(a1);

       

        visitor = new Customer();

        visitor.setName("张三");

        basket.accept(visitor);

        System.out.println("**************************************************");

 

        visitor = new Packer();

        visitor.setName("李四");

        basket.accept(visitor);

        System.out.println("**************************************************");

 

        visitor = new Saler();

        visitor.setName("王五");

        basket.accept(visitor);

    }

 

}

package rjsj.no25;

 

public class Customer extends Visitor{

 

    @Override

    public void visit(Apple apple) {

        System.out.println("顾客->" + name + "买苹果");

    }

 

    @Override

    public void visit(Book book) {

        System.out.println("顾客->" + name + "买书");

    }

   

}

package rjsj.no25;

 

public class Packer extends Visitor{

 

    @Override

    public void visit(Apple apple) {

        System.out.println("打包员->" + name + "给苹果打包");

    }

 

    @Override

    public void visit(Book book) {

        System.out.println("打包员->" + name + "给书打包");

    }

}

package rjsj.no25;

 

public interface Product {

    void accept(Visitor visitor);

}

package rjsj.no25;

 

public class Saler extends Visitor{

 

    @Override

    public void visit(Apple apple) {

        System.out.println("收银员->" + name + "计算苹果价格");

    }

 

    @Override

    public void visit(Book book) {

        System.out.println("收银员->" + name + "计算书的价格");

    }

 

}

package rjsj.no25;

 

public abstract class Visitor {

 

    protected String name;

    public void setName(String name) {

        this.name=name;

    }

    public abstract void visit(Apple apple);

    public abstract void visit(Book book);

}

package rjsj.no25;

 

public class Apple implements Product{

 

    @Override

    public void accept(Visitor visitor) {

        visitor.visit(this);

    }

}

package rjsj.no25;

 

public class Book implements Product{

 

    @Override

    public void accept(Visitor visitor) {

        visitor.visit(this);

    }

}

package rjsj.no25;

 

import java.util.ArrayList;

import java.util.Iterator;

 

public class BuyBasket {

 

    private ArrayList list = new ArrayList();

   

    public void accept(Visitor visitor) {

        Iterator i = list.iterator();

       

        while(i.hasNext()) {

            ((Product)i.next()).accept(visitor);

        }

    }

    public void addProduct(Product product) {

        list.add(product);

    }

 

    public void removeProduct(Product product) {

        list.remove(product);

    }

}

3. 注意编程规范。

 

 

posted @ 2024-11-29 13:58  cor0000  阅读(17)  评论(0)    收藏  举报