Java设计模式之装饰者模式详解和代码实例
什么是装饰者模式?
装饰者模式是一种结构型设计模式,以动态的方式将责任附加到对象上。装饰者提供了与继承相比更为灵活的替代方案,以扩展功能。
装饰者模式的组成
- 抽象构件(Component):定义装饰者和被装饰者的公共接口。
- 具体构件(ConcreteComponent):这是被装饰者,这是需要进行功能扩展的对象。
- 装饰者(Decorator):这是包含被装饰者的实例,装饰者将在被装饰者的行为前面或后面添加一些自己的行为。
- 具体装饰者(ConcreteDecorator):这个组件通过添加自己的行为来扩展与具体构件(ConcreteComponent)相关联的对象的功能。
装饰者模式的优缺点
优点
- 可以动态的扩展一个对象的功能,而继承无法实现这一点。
- 可以使用多个具体装饰者封装具体构件类形成复合装饰者,从而实现各种不同的装饰效果。
- 装饰者模式符合开闭原则,可以在不修改原有代码的基础上,增加功能或修改装饰器的行为。
缺点
- 使用装饰者模式会产生许多小对象,在一定程序上会增加系统的复杂性和理解难度。
- 装饰者模式会改变对象之间的关系,增加对象的嵌套深度,加重了程序的运行负载,可能会导致性能问题。
装饰者模式的代码实例
下面是一个简单的装饰者模式的实例。
示例一:咖啡店
我们来看一个咖啡店的例子,想要给咖啡加上牛奶、糖、摩卡等等,同时也可能会有不加任何调料的咖啡。
// 抽象构件
interface Beverage {
int cost();// 获取饮料价格
String getDescription();// 获取饮料描述
}
// 具体构件
class Coffee implements Beverage {
private int cost = 10;
@Override
public int cost() {
return cost;
}
@Override
public String getDescription() {
return "纯咖啡";
}
}
// 装饰器
class AddonDecorator implements Beverage {
private Beverage beverage;
AddonDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public int cost() {
return this.beverage.cost();
}
@Override
public String getDescription() {
return this.beverage.getDescription();
}
}
// 具体装饰器
class Sugar extends AddonDecorator {
Sugar(Beverage beverage) {
super(beverage);
}
@Override
public int cost() {
return super.cost() + 2;
}
@Override
public String getDescription() {
return super.getDescription() + " 加糖";
}
}
class Milk extends AddonDecorator {
Milk(Beverage beverage) {
super(beverage);
}
@Override
public int cost() {
return super.cost() + 3;
}
@Override
public String getDescription() {
return super.getDescription() + " 加牛奶";
}
}
// 测试类
public class TestDecorator {
public static void main(String[] args) {
// 纯咖啡
Beverage beverage = new Coffee();
System.out.println("纯咖啡价格:" + beverage.cost() + ", 描述:" + beverage.getDescription());
// 加糖咖啡
beverage = new Sugar(beverage);
System.out.println("加糖咖啡价格:" + beverage.cost() + ", 描述:" + beverage.getDescription());
// 加牛奶咖啡
beverage = new Milk(beverage);
System.out.println("加牛奶咖啡价格:" + beverage.cost() + ", 描述:" + beverage.getDescription());
// 加糖加牛奶咖啡
beverage = new Milk(new Sugar(new Coffee()));
System.out.println("加糖加牛奶咖啡价格:" + beverage.cost() + ", 描述:" + beverage.getDescription());
}
}
在上面的例子中,Beverage
是抽象构件,Coffee
是具体构件,AddonDecorator
是装饰器,Sugar
,Milk
都是具体装饰器。
示例二:文件读写
下面是一个文件读写的例子。我们要为文件读写增加加密、压缩等其他操作。
// 文件操作接口,抽象构件
interface FileOperation {
void write(String text);
String read();
}
// 具体文件操作类,也是具体构件
class TextFile implements FileOperation {
private String fileName;
TextFile(String fileName) {
this.fileName = fileName;
}
@Override
public void write(String text) {
System.out.println("Write to " + fileName + ": " + text);
}
@Override
public String read() {
return "Text from " + fileName;
}
}
// 文件操作装饰器
class FileDecorator implements FileOperation {
private FileOperation file;
FileDecorator(FileOperation file) {
this.file = file;
}
@Override
public void write(String text) {
file.write(text);
}
@Override
public String read() {
return file.read();
}
}
// 具体文件加密装饰器
class EncryptedFileDecorator extends FileDecorator {
EncryptedFileDecorator(FileOperation file) {
super(file);
}
@Override
public void write(String text) {
text = text + " [encrypted]";
super.write(text);
}
@Override
public String read() {
String text = super.read();
return text.replace("[encrypted]", "");
}
}
// 具体文件压缩装饰器
class CompressedFileDecorator extends FileDecorator {
CompressedFileDecorator(FileOperation file) {
super(file);
}
@Override
public void write(String text) {
text = text + " [compressed]";
super.write(text);
}
@Override
public String read() {
String text = super.read();
return text.replace("[compressed]", "");
}
}
// 测试类
public class TestFileDecorator {
public static void main(String[] args) {
//不加任何操作
FileOperation file = new TextFile("test.txt");
file.write("Hello World");
System.out.println("Read from file: " + file.read());
//加密操作
file = new EncryptedFileDecorator(file);
file.write("Hello World");
System.out.println("Read from file: " + file.read());
//压缩操作
file = new CompressedFileDecorator(file);
file.write("Hello World");
System.out.println("Read from file: " + file.read());
//加密和压缩操作
file = new CompressedFileDecorator(new EncryptedFileDecorator(new TextFile("test.txt")));
file.write("Hello World");
System.out.println("Read from file: " + file.read());
}
}
在上面的例子中,FileOperation
是抽象构件,TextFile
是具体构件,FileDecorator
是装饰器,EncryptedFileDecorator
,CompressedFileDecorator
是具体装饰器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之装饰者模式详解和代码实例 - Python技术站