MaterialLeaf.java
package com.university.bookstore.composite;
import java.util.List;
import java.util.Objects;
import com.university.bookstore.model.Material;
/**
* Leaf component in the Composite pattern.
* Represents an individual material that cannot contain other components.
*
* <p>This class wraps a Material object and implements the MaterialComponent interface,
* allowing individual materials to be treated uniformly with composite bundles.</p>
*
* @author Navid Mohaghegh
* @version 3.0
* @since 2024-09-15
*/
public class MaterialLeaf implements MaterialComponent {
private final Material material;
/**
* Creates a new material leaf wrapping the specified material.
*
* @param material the material to wrap
* @throws IllegalArgumentException if material is null
*/
public MaterialLeaf(Material material) {
this.material = Objects.requireNonNull(material, "Material cannot be null");
}
@Override
public String getTitle() {
return material.getTitle();
}
@Override
public double getPrice() {
return material.getPrice();
}
@Override
public double getDiscountedPrice() {
return material.getDiscountedPrice();
}
@Override
public String getDescription() {
return material.getDisplayInfo();
}
@Override
public List<Material> getMaterials() {
return List.of(material);
}
@Override
public int getItemCount() {
return 1;
}
@Override
public double getDiscountRate() {
return material.getDiscountRate();
}
@Override
public boolean isLeaf() {
return true;
}
/**
* Gets the wrapped material.
*
* @return the underlying material
*/
public Material getMaterial() {
return material;
}
/**
* Gets the material ID.
*
* @return the material ID
*/
public String getId() {
return material.getId();
}
/**
* Gets the material type.
*
* @return the material type
*/
public Material.MaterialType getType() {
return material.getType();
}
/**
* Gets the material creator.
*
* @return the material creator
*/
public String getCreator() {
return material.getCreator();
}
/**
* Gets the material year.
*
* @return the material year
*/
public int getYear() {
return material.getYear();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MaterialLeaf that = (MaterialLeaf) obj;
return Objects.equals(material, that.material);
}
@Override
public int hashCode() {
return Objects.hash(material);
}
@Override
public String toString() {
return String.format("MaterialLeaf[%s]", material.getTitle());
}
}