Functional:
Non-functional:
Warehouse, Order, PartnerOrder, CustomerOrder, Item
StorageManager, ArrangementStrategy, StagingQueueArrangementStrategy
Warehouse has a StorageManager
StorageManager has a ArrangementStrategy
Order has a Warehouse
Order has Items
StagingQueueArrangementStrategy is an ArrangementStrategy
PartnerOrder is an Order
CustomerOrder is an Order
StagingQueueArrangementStrategy has a queue.
Queue
This represents the staging queue, which holds items ready to be dispatched after placing the order.
FrequencyArrangementStrategy is an ArrangementStrategy
PartnerOrder is an Order
CustomerOrder is an Order
Strategy pattern to sort StorageLocations
package com.example.warehouse.entity.item;
public abstract class Item {
private String id;
private int count;
public String getId() {
return id;
}
/**
* @return the count
*/
public int getCount() {
return count;
}
/**
* @param count the count to set
*/
public void setCount(int count) {
this.count = count;
}
public abstract void incrementCount(int count);
public abstract void decrementCount(int count);
}
package com.example.warehouse.entity.item;
public class ConsumerItem extends Item {
private int count;
@Override
public void incrementCount(int count) {
this.count += count;
}
@Override
public void decrementCount(int count) {
this.count += count;
}
}
package com.example.warehouse.entity.order;
import com.example.warehouse.entity.item.Item;
import com.example.warehouse.entity.warehouse.Warehouse;
public abstract class Order {
private Item item;
private int count;
private Warehouse warehouse;
private String status;
/**
* @return the item
*/
public Item getItem() {
return item;
}
/**
* @param item the item to set
*/
public void setItem(Item item) {
this.item = item;
}
/**
* @return the count
*/
public int getCount() {
return count;
}
/**
* @param count the count to set
*/
public void setCount(int count) {
this.count = count;
}
/**
* @return the warehouse
*/
public Warehouse getWarehouse() {
return warehouse;
}
/**
* @param warehouse the warehouse to set
*/
public void setWarehouse(Warehouse warehouse) {
this.warehouse = warehouse;
}
/**
* @return the status
*/
public String getStatus() {
return status;
}
/**
* @param status the status to set
*/
public void setStatus(String status) {
this.status = status;
}
public abstract boolean isValid();
public abstract void place();
}
package com.example.warehouse.entity.order;
public class CustomerOrder extends Order {
@Override
public boolean isValid() {
return getItem().getCount() >= getCount();
}
@Override
public void place() {
if (isValid()) {
getItem().incrementCount(getCount());
getWarehouse().getStorageManager().prepareForDispatch(getItem(), getCount());
}
}
}
package com.example.warehouse.entity.order;
public class PartnerOrder extends Order {
@Override
public boolean isValid() {
return getWarehouse().getCapacity() >= getCount();
}
@Override
public void place() {
if (isValid()) {
getItem().incrementCount(getCount());
}
}
}
package com.example.warehouse.entity.warehouse;
import com.example.warehouse.service.storagemanager.StorageManager;
public abstract class Warehouse {
private StorageManager storageManager;
private int capacity;
/**
* @return the storageManager
*/
public StorageManager getStorageManager() {
return storageManager;
}
/**
* @param storageManager the storageManager to set
*/
public void setStorageManager(StorageManager storageManager) {
this.storageManager = storageManager;
}
/**
* @return the capacity
*/
public int getCapacity() {
return capacity;
}
/**
* @param capacity the capacity to set
*/
public void setCapacity(int capacity) {
this.capacity = capacity;
}
}
package com.example.warehouse.entity.warehouse;
public class WarehouseImpl extends Warehouse {
}
package com.example.warehouse.service.storagemanager;
import com.example.warehouse.entity.item.Item;
public class StorageManager {
ArrangementStrategy arrangementStrategy;
StorageManager(ArrangementStrategy arrangementStrategy) {
this.arrangementStrategy = arrangementStrategy;
}
public void prepareForDispatch(Item item, int count) {
arrangementStrategy.arrangeStorageForDispatch(item, count);
}
}
package com.example.warehouse.service.storagemanager;
import com.example.warehouse.entity.item.Item;
public abstract class ArrangementStrategy {
abstract void arrangeStorageForDispatch(Item item, int count);
}
package com.example.warehouse.service.storagemanager;
import java.util.LinkedList;
import java.util.Queue;
import com.example.warehouse.entity.item.Item;
public class StagingQueueArrangementStrategy extends ArrangementStrategy {
Queue<Object[]> stagingQueue = new LinkedList<>();
@Override
void arrangeStorageForDispatch(Item item, int count) {
stagingQueue.offer(new Object[] { item.getId(), count });
}
}
Try creating a class, flow, state and/or sequence diagram using the diagramming tool. Mermaid flow diagrams can be used to represent system use cases. You can ask the interviewer bot to create a starter diagram if unfamiliar with the tool. Briefly explain your diagrams if necessary...
Critically examine your design for any flaws or areas for future improvement...