Visitor Mode Visitor (behavioral)

Source: Internet
Author: User
Tags abstract

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 ());
    }
}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.