假设我们正在开发一个电商网站,我们需要实现一个购物车系统。为了满足客户的需求,我们决定使用单例模式来确保购物车只有一个实例。我们还使用工厂模式来创建商品对象,并使用装饰器模式来添加额外的商品属性,如颜色、尺寸和材质等。 为了实现购物车的实时更新,我们使用观察者模式来通知购物车中的商品变化。当客户选择一种支付方式时,我们使用策略模式来选择相应的付款策略,例如信用卡、支付宝或微信支付等。的具体实现代码java
时间: 2024-03-10 19:43:30 浏览: 15
下面是一个示例代码,其中演示了如何使用单例模式、工厂模式、装饰器模式、观察者模式和策略模式来实现购物车系统。
首先,我们定义一个名为 `ShoppingCart` 的单例类,用于表示购物车对象:
```java
public class ShoppingCart {
private static ShoppingCart instance;
private List<Product> products;
private List<Observer> observers;
private ShoppingCart() {
products = new ArrayList<>();
observers = new ArrayList<>();
}
public static ShoppingCart getInstance() {
if (instance == null) {
instance = new ShoppingCart();
}
return instance;
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void addProduct(Product product) {
products.add(product);
notifyObservers();
}
public void removeProduct(Product product) {
products.remove(product);
notifyObservers();
}
private void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
public List<Product> getProducts() {
return products;
}
}
```
在上面的代码中,我们使用了私有的构造函数和一个 `getInstance()` 方法来确保只有一个 `ShoppingCart` 实例。我们还定义了一个 `addObserver()` 和 `removeObserver()` 方法来添加和删除观察者对象。我们使用 `addProduct()` 和 `removeProduct()` 方法来添加和删除商品,并在其中调用 `notifyObservers()` 方法来通知观察者对象购物车的变化。
然后,我们定义一个名为 `Product` 的抽象类,用于表示商品对象:
```java
public abstract class Product {
protected String name;
protected double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public abstract String getDescription();
}
```
在上面的代码中,我们定义了商品对象的共同属性,如名称和价格,并使用抽象方法 `getDescription()` 来获取商品的描述信息。
接下来,我们定义了一个名为 `ProductFactory` 的工厂类,用于创建商品对象:
```java
public class ProductFactory {
public static Product createProduct(String type, String name, double price) {
Product product = null;
switch (type) {
case "clothing":
product = new Clothing(name, price);
break;
case "electronics":
product = new Electronics(name, price);
break;
case "food":
product = new Food(name, price);
break;
}
return product;
}
}
```
在上面的代码中,我们使用了简单工厂模式来创建商品对象。我们通过一个 `createProduct()` 静态方法来创建商品对象,并根据不同的 `type` 参数创建不同类型的商品对象。
然后,我们定义了一个名为 `ColorDecorator` 的装饰器类,用于添加颜色属性:
```java
public class ColorDecorator extends ProductDecorator {
private String color;
public ColorDecorator(Product product, String color) {
super(product);
this.color = color;
}
public String getColor() {
return color;
}
@Override
public String getDescription() {
return super.getDescription() + ", " + color;
}
}
```
在上面的代码中,我们继承了抽象类 `ProductDecorator` 并使用 `super()` 方法来调用父类的构造函数。我们还定义了一个名为 `getColor()` 的方法来获取颜色属性。我们使用 `getDescription()` 方法来获取商品的描述信息,并在其中添加颜色属性。
接下来,我们定义了一个名为 `SizeDecorator` 的装饰器类,用于添加尺寸属性:
```java
public class SizeDecorator extends ProductDecorator {
private String size;
public SizeDecorator(Product product, String size) {
super(product);
this.size = size;
}
public String getSize() {
return size;
}
@Override
public String getDescription() {
return super.getDescription() + ", " + size;
}
}
```
在上面的代码中,我们同样继承了抽象类 `ProductDecorator` 并使用 `super()` 方法来调用父类的构造函数。我们还定义了一个名为 `getSize()` 的方法来获取尺寸属性。我们使用 `getDescription()` 方法来获取商品的描述信息,并在其中添加尺寸属性。
最后,我们定义了一个名为 `PaymentStrategy` 的接口,用于表示付款策略:
```java
public interface PaymentStrategy {
void pay(double amount);
}
```
在上面的代码中,我们定义了一个 `pay()` 方法来进行付款操作。
我们还定义了三个名为 `CreditCardStrategy`、`AlipayStrategy` 和 `WechatPayStrategy` 的类,分别实现了 `PaymentStrategy` 接口并实现了相应的付款策略。
现在,我们可以使用上述代码来实现购物车系统。例如:
```java
// 创建一个购物车对象
ShoppingCart cart = ShoppingCart.getInstance();
// 添加观察者对象
cart.addObserver(new CartObserver());
// 创建几个商品对象
Product tShirt = ProductFactory.createProduct("clothing", "T恤", 99.99);
Product iphone = ProductFactory.createProduct("electronics", "iPhone", 9999.99);
Product pizza = ProductFactory.createProduct("food", "披萨", 59.99);
// 对商品对象进行装饰
tShirt = new ColorDecorator(tShirt, "红色");
iphone = new SizeDecorator(iphone, "128GB");
pizza = new SizeDecorator(new ColorDecorator(pizza, "大"), "14英寸");
// 将商品对象添加到购物车对象中
cart.addProduct(tShirt);
cart.addProduct(iphone);
cart.addProduct(pizza);
// 获取购物车中的商品列表
List<Product> products = cart.getProducts();
// 输出商品列表
for (Product product : products) {
System.out.println(product.getName() + " - " + product.getDescription() + " - " + product.getPrice());
}
// 选择一种支付方式
PaymentStrategy paymentStrategy = new CreditCardStrategy("1234 5678 9012 3456", "12/23", "123");
// 进行付款操作
paymentStrategy.pay(cart.getTotalPrice());
```
在上面的代码中,我们创建了一个购物车对象,并将一个观察者对象添加到购物车对象中。我们创建了几个商品对象,并使用装饰器模式对其进行装饰。我们将装饰后的商品对象添加到购物车对象中,并获取购物车中的商品列表并输出。最后,我们选择一种支付方式并进行付款操作。