参考文档:
1.设计模式-可复用面向对象软件的基础
2.http://blog.csdn.net/cooldragon/article/details/52177273(设计模式总结之Visitor Pattern(访问者模式))
Visitor模式的理论知识,可以参考 参考文档;
案例实现,这里的案例是参考文档1,书中代码实现的案例。案例是在Composite模式的基础上,实现的Visitor模式
代码实现:
可以查看一下相关类图:
Composite相关代码实现模式:
CompositeClient.java:
package com.rick.designpattern.visitor;
/**
* Created by MyPC on 2017/6/12.
*/
public class CompositeClient {
public static void main(String[] args) {
Cabinet cabinet = new Cabinet("PC Cabinet");
Chassis chassis = new Chassis("PC Chassis");
cabinet.add(chassis);
Bus bus = new Bus("MCA Bus");
bus.add(new Card("16Mbs Token Ring"));
chassis.add(bus);
chassis.add(new FloppyDisk("3.5in Floppy"));
System.out.println("The net price is " + chassis.netPrice().getPrice());
}
}
Currency.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class Currency { private CurrencyType type = CurrencyType.RMB; private float price; public Currency() { } public Currency(float price) { this.price = price; } public Currency(CurrencyType type, float price) { this.type = type; this.price = price; } public CurrencyType getType() { return type; } public void setType(CurrencyType type) { this.type = type; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public enum CurrencyType { RMB("RMB"); private String type; CurrencyType(String type) { this.type = type; } public String getType() { return type; } public void setType(String type) { this.type = type; } } }
Watt.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class Watt { private float powerx; public Watt(float powerx) { this.powerx = powerx; } public float getPowerx() { return powerx; } public void setPowerx(float powerx) { this.powerx = powerx; } }
Equipment.java:
package com.rick.designpattern.visitor; import java.util.List; /** * 设备信息 * <p> * Created by MyPC on 2017/6/12. */ public abstract class Equipment { private String name; public Equipment(String name) { this.name = name; } public String name() { return name; } /** * 功率 * * @return */ public Watt power() { return new Watt(0f); } /** * 实际价格 * * @return */ public Currency netPrice() { return new Currency(0f); } /** * 折扣价格 * * @return */ public Currency discountPrice() { return new Currency(0f); } public void add(Equipment equipment) { } public void remove(Equipment equipment) { } public List<Equipment> createIterator() { return null; } public abstract void accept(EquipmentVisitor visitor); }
FloppyDisk.java:
package com.rick.designpattern.visitor;
/**
* Created by MyPC on 2017/6/12.
*/
public class FloppyDisk extends Equipment {
public FloppyDisk(String name) {
super(name);
}
@Override
public Watt power() {
return new Watt(100);
}
@Override
public Currency netPrice() {
return new Currency(156f);
}
@Override
public Currency discountPrice() {
return new Currency(150f);
}
@Override
public void accept(EquipmentVisitor visitor) {
visitor.visitFloppyDisk(this);
}
}
Chassis.java:
package com.rick.designpattern.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* Created by MyPC on 2017/6/12.
*/
public class Chassis extends Equipment {
private List<Equipment> equipments = new ArrayList<Equipment>();
public Chassis(String name) {
super(name);
}
/**
* 功率
*
* @return
*/
public Watt power() {
Watt watt = new Watt(0f);
for (Equipment equipment : createIterator()) {
watt.setPowerx(watt.getPowerx() + equipment.power().getPowerx());
}
return watt;
}
/**
* 实际价格
*
* @return
*/
public Currency netPrice() {
Currency currency = new Currency(0f);
for (Equipment equipment : createIterator()) {
currency.setPrice(currency.getPrice() + equipment.netPrice().getPrice());
}
return currency;
}
/**
* 折扣价格
*
* @return
*/
public Currency discountPrice() {
Currency currency = new Currency(0f);
for (Equipment equipment : createIterator()) {
currency.setPrice(currency.getPrice() + equipment.discountPrice().getPrice());
}
return currency;
}
public void add(Equipment equipment) {
equipments.add(equipment);
}
public void remove(Equipment equipment) {
equipments.remove(equipment);
}
public List<Equipment> createIterator() {
return equipments;
}
@Override
public void accept(EquipmentVisitor visitor) {
for (Equipment equipment : equipments) {
equipment.accept(visitor);
}
visitor.visitChassis(this);
}
}
Bus.java:
package com.rick.designpattern.visitor;
/**
* Created by MyPC on 2017/6/12.
*/
public class Bus extends Chassis {
public Bus(String name) {
super(name);
}
@Override
public Watt power() {
return new Watt(50f);
}
@Override
public Currency netPrice() {
return new Currency(80f);
}
@Override
public Currency discountPrice() {
return new Currency(69f);
}
@Override
public void accept(EquipmentVisitor visitor) {
visitor.visitBus(this);
}
}
Cabinet.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class Cabinet extends Chassis { public Cabinet(String name) { super(name); } @Override public Watt power() { return new Watt(70f); } @Override public Currency netPrice() { return new Currency(150f); } @Override public Currency discountPrice() { return new Currency(139f); } @Override public void accept(EquipmentVisitor visitor) { visitor.visitCabinet(this); } }
Card.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class Card extends Chassis { public Card(String name) { super(name); } @Override public Watt power() { return new Watt(70f); } @Override public Currency netPrice() { return new Currency(70f); } @Override public Currency discountPrice() { return new Currency(59f); } @Override public void accept(EquipmentVisitor visitor) { visitor.visitCard(this); } }
Visitor相关代码实现:
EquipmentVisitor.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public abstract class EquipmentVisitor { public EquipmentVisitor() { } abstract void visitFloppyDisk(FloppyDisk floppyDisk); abstract void visitCard(Card card); abstract void visitChassis(Chassis chassis); abstract void visitBus(Bus bus); abstract void visitCabinet(Cabinet cabinet); }
Inventory.java:
package com.rick.designpattern.visitor; import java.util.ArrayList; import java.util.List; /** * Created by MyPC on 2017/6/12. */ public class Inventory { private List<Equipment> equipmentList = new ArrayList<Equipment>(); public void accumulate(Equipment equipment) { equipmentList.add(equipment); } public int getAccumulate() { int total = 0; for (Equipment equipment : equipmentList) { total++; if (null != equipment.createIterator()) { total += equipment.createIterator().size(); } } return total; } }
InventoryVisitor.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class InventoryVisitor extends EquipmentVisitor { private Inventory inventory = new Inventory(); public Inventory getInventory() { return inventory; } @Override void visitFloppyDisk(FloppyDisk floppyDisk) { inventory.accumulate(floppyDisk); } @Override void visitCard(Card card) { } @Override void visitChassis(Chassis chassis) { inventory.accumulate(chassis); } @Override void visitBus(Bus bus) { } @Override void visitCabinet(Cabinet cabinet) { } }
PricingVisitor.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class PricingVisitor extends EquipmentVisitor { private float total; public PricingVisitor() { } public float getTotal() { return total; } @Override void visitFloppyDisk(FloppyDisk floppyDisk) { total += floppyDisk.netPrice().getPrice(); } @Override void visitCard(Card card) { } @Override void visitChassis(Chassis chassis) { total += chassis.netPrice().getPrice(); } @Override void visitBus(Bus bus) { } @Override void visitCabinet(Cabinet cabinet) { } }
VisitorClient.java:
package com.rick.designpattern.visitor; /** * Created by MyPC on 2017/6/12. */ public class VisitorClient { public static void main(String[] args) { Cabinet cabinet = new Cabinet("PC Cabinet"); Chassis chassis = new Chassis("PC Chassis"); cabinet.add(chassis); Bus bus = new Bus("MCA Bus"); bus.add(new Card("16Mbs Token Ring")); chassis.add(bus); chassis.add(new FloppyDisk("3.5in Floppy")); PricingVisitor pricingVisitor = new PricingVisitor(); chassis.accept(pricingVisitor); System.out.println(chassis.name() + " in price is " + pricingVisitor.getTotal()); InventoryVisitor inventoryVisitor = new InventoryVisitor(); chassis.accept(inventoryVisitor); System.out.println("Inventory " + chassis.name() + " " + inventoryVisitor.getInventory().getAccumulate()); } }