Java设计模式之装饰模式详解
简介
装饰模式是一种结构型设计模式,它允许我们在不改变现有对象结构的情况下向其中添加新功能。
在装饰模式中,我们创建一个装饰器(Decorator)类,用于包装原有的类,并在原有基础上添加新的行为、状态或属性。这种方式实现了对原有类的扩展,同时也不影响原有类的行为。
设计原则
- 开放-封闭原则(Open-Closed Principle):软件中的对象(类、模块、函数等)应该对扩展开放,但对修改封闭。
- 单一职责原则(Single Responsibility Principle):一个类应该只有一个引起它变化的原因。
示例
示例1:实现一个饮料类
我们首先创建一个饮料类(Beverage)用于表示所有饮料的基类。该类只包含一个描述信息(description)与一个计算饮料价格的方法(cost)。
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
接下来,我们创建两个具体的饮料类:Espresso(浓缩咖啡)和HouseBlend(混合咖啡)。这两个类分别继承自饮料基类,实现了自己的饮料描述和价格计算方式。
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
}
public double cost() {
return 0.89;
}
}
现在我们已经实现了两个饮料类,并且可以计算出它们的价格。但是现在,我们需要为这些饮料添加一些调料,比如蒸奶、摩卡等。我们可以借助装饰模式完成这个功能。
示例2:实现饮料调料类
我们首先创建一个调料类(CondimentDecorator),作为装饰器类的基类。该类也继承自饮料基类,实现了自己的饮料描述和价格计算方式。
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
接下来,我们创建一些具体的调料类:Milk(牛奶)、Mocha(摩卡)和Soy(豆浆)。这些调料类同样继承自调料基类,实现了自己的调料描述和价格计算方式。
public class Milk extends CondimentDecorator {
Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
public double cost() {
return 0.10 + beverage.cost();
}
}
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return 0.20 + beverage.cost();
}
}
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
public double cost() {
return 0.15 + beverage.cost();
}
}
这些调料类与饮料类非常类似,但它们包装了一个被装饰对象(即饮料对象),并重写了getDescription方法和cost方法。在这里,getDescription方法返回饮料对象的描述信息,加上调料对象的描述信息。cost方法返回饮料对象的价格,加上调料对象的价格。
示例3:组合饮料和调料
现在,我们可以组合多个饮料和调料,创建出不同的组合饮料。
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
Beverage beverage2 = new HouseBlend();
beverage2 = new Soy(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Milk(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
在第一个例子中,我们创建了一杯浓缩咖啡,它没有任何调料,价格为1.99美元。
在第二个例子中,我们创建了一杯混合咖啡,加上了豆浆、摩卡和牛奶三种调料,价格为1.34美元。
总结
装饰模式是一种优秀的设计模式,在软件开发中有着广泛的应用,它可以帮助我们灵活地扩展类的功能,并且不影响原有类的行为。这个模式有一个清晰的结构,其中基础组件与装饰器组件之间耦合度非常低。我们只需为基础组件和装饰器组件定义相同的接口,并让它们都从同一个基类继承而来,就可以轻松地组合它们。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之装饰模式详解 - Python技术站