访问者模式Visitor(行为型)

参考文档:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值