美文网首页
设计模式:访问者

设计模式:访问者

作者: coder_liu | 来源:发表于2017-09-24 01:15 被阅读0次

场景

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

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

代码

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的方法会变化

相关文章

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 设计模式之访问者(Visitor)

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式...

  • 访问者模式一篇就够了

    访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,...

  • 访问者模式

    访问者模式属于行为型模式。访问者模式是一种将数据结构和数据操作分离的设计模式。访问者模式比较复杂,而且实际使用的地...

  • Android设计模式——访问者模式(十一大行为型)

    1.访问者模式介绍 访问者模式时十一大行为型设计模式之一。 访问者模式是一种将数据操作与数据结构分...

  • Java设计模式<访问者模式>

    Java设计模式<访问者模式> 意图 将对象的结构和操作分离 角色 抽象访问者:抽象类或者接口,声明访问者可以访问...

  • 25.访问者模式(行为型)

    访问者模式(行为型) 一、相关概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成...

  • 设计模式之访问者模式

    访问者模式是一种行为设计模式,它能将算法与其所作用的对象隔离开来。 访问者模式建议将新行为放入一个名为访问者的独立...

  • 手撸golang 行为型设计模式 访问者模式

    手撸golang 行为型设计模式 访问者模式 缘起 最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔...

网友评论

      本文标题:设计模式:访问者

      本文链接:https://www.haomeiwen.com/subject/fnxbdxtx.html