Reference Documentation:
1. Design mode-the basis of reusable object-oriented software
2.http://blog.csdn.net/cooldragon/article/details/52177273 (Visitor pattern Summary of Design patterns (visitor mode))
Visitor model of the theoretical knowledge, you can refer to the reference document;
Case implementation, the case here is reference to document 1, the code in the book implementation of the case. The case is based on the composite model, the implementation of the visitor model
Code implementation:
You can look at the related class diagram:
Composite related code Implementation mode:
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 C Abinet ");
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 () {} publicly 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;
The 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;
/** * Device Information * <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;
/** * Power * * @return */public Watt power () {return new Watt (0f);
}/** * actual price * * @return */public Currency Netprice () {return new Currency (0f); }/** * Discounted price * * @return */public Currency Discountprice () {return new Currency (
0f); ' public void ' Add (equipment equipment) {} public void remove (equipment equipment) {} public Li
St<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;
}
@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);
/** * Power * * @return */public Watt power () {Watt Watt = new Watt (0f); for (Equipment Equipment:createiterator ()) {Watt.setpowerx (Watt.getpowerx () + Equipment.power (). GetPowerx ()
);
} return Watt; }/** * actual price * * @return */public Currency Netprice () {Currency Currency = new Curr
Ency (0f); for (Equipment Equipment:createiterator ()) {Currency.setprice (Currency.getprice () + equipment.netprice (). GE
Tprice ());
} return currency;
}/** * Discounted price * * @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 Related Code implementation:
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);
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) {
}
@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 () {
} publicly
float gettotal () {
return total;
}
@Override
void Visitfloppydisk (Floppydisk floppydisk) {Total
+ = Floppydisk.netprice (). GetPrice ()
;
@Override
void Visitcard (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 Cab Inet ");
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" + pricingvisitor.gettotal ());
Inventoryvisitor inventoryvisitor = new Inventoryvisitor ();
Chassis.accept (inventoryvisitor);
System.out.println ("Inventory" + chassis.name () + "" + inventoryvisitor.getinventory (). Getaccumulate ());
}
}