设计模式:访问者

场景

病人上医院都是先挂号、看病、医生写医药单。病人拿着医药单需要做两件事情

  • 给收费处的收费员
  • 给医药派药员
    在此,需要你实现关于收费处收费员和派药员的场景

代码

public class Medicine {
    private String name;
    private long price;
    private String address;
    public Medicine() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getPrice() {
        return price;
    }
    public void setPrice(long price) {
        this.price = price;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public void accept(IVisitor visitor) {
        visitor.visitor(this);
    }
}

public class MedicineA extends Medicine {
    public MedicineA() {
       setName("板蓝根");
       setPrice(1l);
       setAddress("第一排第二格");
    }
}

public class MedicineB extends Medicine {
    public MedicineB() {
                setName("感康");
                setPrice(3l);
                setAddress("第二排第二格");
    }
}

public interface IVisitor {
    public void visitor(Medicine medicine);
}

public class HospitalCashier implements IVisitor {
    private String name;
    public HospitalCashier(String name) {
        this.name = name;
    }
    public void visitor(Medicine medicine) {
        String msg = String.format("%s药需要%s元", medicine.getName(), medicine.getPrice());
        System.out.println(msg);
    }
}

public class MedicineTaker implements IVisitor {
    private String name;
    public MedicineTaker(String name) {
        this.name = name;
    }
    public void visitor(Medicine medicine) {
      System.out.println(String.format("%s药在%s", medicine.getName(), medicine.getAddress()));
    }
}

public class Tester{
    public static void main(String[] args) {
        HospitalCashier cashier = new HospitalCashier("lining");
        MedicineTaker taker = new MedicineTaker("zhanghai");
        Medicine medicineA = new MedicineA();
        Medicine medicineB = new MedicineB();
        medicineA.accept(cashier);
        medicineB.accept(cashier);
        medicineA.accept(taker);
        medicineA.accept(taker);
    }
}

定义

表示一个作用于某对象结构中的各元素的操作。它使你可以在不该变各元素的类的前提下定义作用于这些元素的新操作。

类图

访问者.gif

优缺点

优点

  • 加visitor会容易,因为不用改变原有元素的内容
    缺点
  • 增加元素就比较不好搞,因为visitor的方法会变化
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、定义 访问者模式(Visitor Pattern)是一个相对简单的模式,其定义如下:Represent an ...
    端木轩阅读 454评论 0 0
  • 定义 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改...
    步积阅读 1,262评论 0 3
  • 摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式...
    su9257_海澜阅读 435评论 0 0
  • 熙熙攘攘的人流,摇摇晃晃的地铁,昏昏沉沉的脑袋,我和妈妈正在回姥姥家的路上。 “哇……”一阵清脆的哭声...
    珩行天下无敌手阅读 205评论 0 0
  • 外面工地的搅拌机混杂着混凝土浇筑的嘈杂声,在夏天纯粹的蝉鸣中显得格外刺耳。楼顶上的两个男人叼着烟头,任它自由的燃烧...
    秋水长天不一色阅读 159评论 0 1