Java设计模式-组合模式详解
什么是组合模式?
组合模式属于结构型设计模式,它将对象组合成树形结构,以表示'部分-整体'的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性,通常适用于处理树形结构,或者希望将单个对象和组合对象以相同的方式进行处理。
组合模式主要包含以下两种角色:
-
Component(抽象构件):定义了叶子和容器构件的公用接口,并提供默认实现
-
Leaf(叶子构件):在组合结构中表示叶子节点对象,它实现了Component接口的操作,但是叶子节点没有子节点
-
Composite(容器构件):表示容器节点对象,它实现了Component接口的操作,并且包含或管理子节点(即Leaf和Composite)
组合模式的优点是什么?
在使用组合模式时,可以获得以下优点:
-
简化客户端操作,将单个对象和组合对象看作一致,无需过多考虑对象的层次结构
-
客户可以一致性的使用组合结构中所有对象
-
方便增加新的构件,符合开闭原则
组合模式示例1: 文件系统
现在我们使用组合模式实现一个文件系统,文件系统包含文件夹和文件两种对象,文件夹可以包含文件夹或文件。文件系统操作包含创建文件夹、创建文件、删除文件夹、删除文件以及展示文件和文件夹等。
public interface FileSystem {
void show(String prefix);
String getName();
}
public class Folder implements FileSystem {
private final String name;
private final List<FileSystem> files;
public Folder(String name) {
this.name = name;
this.files = new ArrayList<>();
}
@Override
public void show(String prefix) {
System.out.println(prefix + name);
prefix += " "; // 缩进处理
for (FileSystem file : files) {
file.show(prefix);
}
}
@Override
public String getName() {
return this.name;
}
public void addFile(FileSystem file) {
files.add(file);
}
public void removeFile(FileSystem file) {
files.remove(file);
}
}
public class File implements FileSystem {
private final String name;
public File(String name) {
this.name = name;
}
@Override
public void show(String prefix) {
System.out.println(prefix + name);
}
@Override
public String getName() {
return this.name;
}
}
示例2: 饮品现场下单系统
在饮品下单系统中,有饮品和套餐两种对象,套餐对象包含了饮品和其他套餐,它们都可以打印出订单中的内容。具体的代码实现如下:
public abstract class Drink {
protected final String name;
protected final Double price;
public Drink(String name, Double price) {
this.name = name;
this.price = price;
}
public void print() {
System.out.println(name + " : ¥" + price);
}
public Double getPrice() {
return price;
}
}
public class Coffee extends Drink {
public Coffee(String name, Double price) {
super(name, price);
}
}
public class Juice extends Drink {
public Juice(String name, Double price) {
super(name, price);
}
}
public class Meal {
protected final String name;
protected final Double price;
protected final List<Drink> drinks;
public Meal(String name) {
this.name = name;
this.price = 0.0;
this.drinks = new ArrayList<>();
}
public Meal(String name, Double price) {
this.name = name;
this.price = price;
this.drinks = new ArrayList<>();
}
public void addDrink(Drink drink) {
drinks.add(drink);
}
public void removeDrink(Drink drink) {
drinks.remove(drink);
}
public Double getPrice() {
Double totalPrice = price;
for (Drink drink : drinks) {
totalPrice += drink.getPrice();
}
return totalPrice;
}
public void print() {
System.out.println(String.format("套餐名称:%s, 价格:¥%.2f", name, getPrice()));
System.out.println("饮品列表:");
for (Drink drink : drinks) {
drink.print();
}
}
}
public class SetMeal extends Meal {
private final List<Meal> meals;
public SetMeal(String name, Double price) {
super(name, price);
this.meals = new ArrayList<>();
}
public void addMeal(Meal meal) {
meals.add(meal);
}
public void removeMeal(Meal meal) {
meals.remove(meal);
}
@Override
public Double getPrice() {
Double totalPrice = price;
for (Meal meal : meals) {
totalPrice += meal.getPrice();
}
for (Drink drink : drinks) {
totalPrice += drink.getPrice();
}
return totalPrice;
}
@Override
public void print() {
System.out.println(String.format("套餐名称:%s, 价格:¥%.2f", name, getPrice()));
System.out.println("套餐包含:");
for (Meal meal : meals) {
meal.print();
}
System.out.println("饮品列表:");
for (Drink drink : drinks) {
drink.print();
}
}
}
以上就是组合模式的详解,包括了什么是组合模式、优点以及两个示例。使用组合模式可以非常方便地处理树形结构的数据,提高代码的可读性和可维护性,是一种非常实用的设计模式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java设计模式-组合模式详解 - Python技术站