GiftWrappingDecorator.java
package com.university.bookstore.decorator;
import java.util.Objects;
import com.university.bookstore.model.Material;
/**
* Decorator that adds gift wrapping functionality to materials.
* Increases the price and provides gift wrapping information.
*
* @author Navid Mohaghegh
* @version 3.0
* @since 2024-09-15
*/
public class GiftWrappingDecorator extends MaterialDecorator {
private static final double GIFT_WRAPPING_COST = 5.99;
private final String wrappingStyle;
/**
* Creates a new gift wrapping decorator.
*
* @param material the material to wrap
* @param wrappingStyle the style of gift wrapping
* @throws IllegalArgumentException if wrappingStyle is null or empty
*/
public GiftWrappingDecorator(Material material, String wrappingStyle) {
super(material);
if (wrappingStyle == null || wrappingStyle.trim().isEmpty()) {
throw new IllegalArgumentException("Wrapping style cannot be null or empty");
}
this.wrappingStyle = wrappingStyle.trim();
}
@Override
public double getPrice() {
return decoratedMaterial.getPrice() + GIFT_WRAPPING_COST;
}
@Override
public String getDisplayInfo() {
return decoratedMaterial.getDisplayInfo() +
String.format(" [Gift Wrapped: %s (+$%.2f)]",
wrappingStyle, GIFT_WRAPPING_COST);
}
/**
* Gets the wrapping style.
*
* @return the wrapping style
*/
public String getWrappingStyle() {
return wrappingStyle;
}
/**
* Gets the gift wrapping cost.
*
* @return the gift wrapping cost
*/
public double getGiftWrappingCost() {
return GIFT_WRAPPING_COST;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
if (!super.equals(obj)) return false;
GiftWrappingDecorator that = (GiftWrappingDecorator) obj;
return Objects.equals(wrappingStyle, that.wrappingStyle);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), wrappingStyle);
}
}