目录
1、什么是装饰者模式?
装饰者模式是一种结构型设计模式,它允许在不修改现有对象结构的情况下,动态地添加功能或行为。在装饰者模式中,我们定义了一个装饰者类来包装原始对象,从而扩展其功能或行为。
以下是一个使用Java代码描述装饰者模式的示例:
首先,我们定义一个接口Component,它表示一个抽象组件,可以是一个具体对象或者是一个抽象对象,它定义了一个操作方法operation。
public interface Component {
public void operation();
}
然后,我们定义一个具体组件ConcreteComponent,实现Component接口,它是我们需要被装饰的原始对象。
public class ConcreteComponent implements Component {
public void operation() {
System.out.println("执行原始操作");
}
}
接下来,我们定义一个装饰者类Decorator,也实现了Component接口,它包装了一个Component对象,并且具有与Component相同的接口。// 定义了一个抽象类
public abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
component.operation();
}
}
在Decorator中,我们持有了一个Component对象,并在其操作方法中调用了Component对象的操作方法。
最后,我们定义具体的装饰者类ConcreteDecorator,它扩展了Decorator类,并添加了一些额外的操作。
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation() {
super.operation();
addedBehavior();
}
public void addedBehavior() {
System.out.println("执行额外操作");
}
}
在ConcreteDecorator中,我们首先调用了Decorator的operation方法,然后再添加了一些额外的操作。
下面是使用装饰者模式的示例代码:
Component component = new ConcreteComponent(); // 创建原始对象
component.operation(); // 执行原始操作
Component decorator = new ConcreteDecorator(component); // 创建装饰者对象
decorator.operation(); // 执行原始操作和额外操作
在上面的示例代码中,我们首先创建了一个原始对象ConcreteComponent,然后再创建了一个装饰者对象ConcreteDecorator,并将原始对象作为参数传递给装饰者对象。最后,我们执行装饰者对象的操作方法,它会先执行原始操作,然后再执行额外操作。
总的来说,装饰者模式可以很方便地扩展原始对象的功能,而且还可以使用多个装饰者对象来对原始对象进行不同程度的扩展。// 是不是发现装饰者模式跟代理模式很像?没错,他就是很像,单从代码功能和作用来说,有时候两者近乎可以看成是同一个东西
2、装饰者模式和代理模式的区别
装饰者模式和代理模式都是结构型设计模式,它们的实现方式有些相似,但它们的目的和应用场景有所不同。
装饰者模式旨在动态地给一个对象添加额外的职责或行为,同时保持接口的一致性,它以透明的方式扩展对象的功能,不需要对原始对象进行修改。装饰者模式适用于需要在运行时动态地添加或删除功能的情况,以及避免使用继承来扩展功能的情况。
代理模式则是在不改变原始对象接口的情况下,控制对对象的访问。代理模式可以用于实现远程代理、虚拟代理、保护代理等。代理模式可以隐藏对象的实现细节,也可以在需要的时候,延迟对象的创建和初始化。
在具体实现上,代理模式一般会持有一个对被代理对象的引用,并在需要的时候将请求转发给被代理对象。而装饰者模式则一般会持有一个对被装饰对象的引用,并在其基础上添加一些额外的职责或行为。// 在实现上可以上没有多大区别,想想静态代理的实现,其中代理类不就可以看成是一个装饰者类吗?
总的来说,代理模式和装饰者模式都是用于扩展对象功能的模式,但是代理模式的目的是控制访问,而装饰者模式的目的是动态地添加功能。在实际应用中,需要根据具体的需求来选择合适的模式。
// 所以,你看,他又是一个概念性的东西,想想我们的日常开发过程,在Service层引用了另一个Service对象,像不像在做一个装饰?
装饰者模式是一种结构型设计模式,允许在不修改对象的情况下动态添加功能。它与代理模式相似但目的不同:装饰者关注于添加行为,而代理模式着重于控制访问。文章通过Java代码示例解释了装饰者模式的工作原理,并对比了装饰者与代理模式的应用场景。
412

被折叠的 条评论
为什么被折叠?



