时间:2026-02-11 21:57
人气:
作者:admin
在不改变原有对象的前提下(不改变ConcreteComponent情况下),给原有对象扩展功能(利用ConcreteDecorator扩展功能,在ConcreteDecorator中注入ConcreteComponent)。如下所示:

扩展一个类的功能,或者给一个类添加一些附加职责
①、灵活改变组合;
②、符合开闭原则;
package decorator;
public class DecoratorDesignPattern {
public static void main(String[] args) {
Decorator decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
decoratorA.operation();
Decorator decoratorB = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent()));
decoratorB.operation();
}
}
interface Component{
void operation();
}
class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("拍照...\n");
}
}
abstract class Decorator implements Component{
Component component;
public Decorator(Component component) {
this.component = component;
}
}
class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("添加美颜....");
component.operation();
}
}
class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("添加滤镜");
component.operation();
}
}
上面代码的运行结果如下:

package decorator;
public class DecoratorPattern {
public static void main(String[] args) {
Circle circle = new Circle();
RedShapeDecorator redCircle = new RedShapeDecorator(circle);
Rectangle rectangle = new Rectangle();
RedShapeDecorator redRectangle = new RedShapeDecorator(rectangle);
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape:Circle");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape:Rectangle");
}
}
abstract class ShapeDecorator implements Shape {
public Shape decoratedShape;
public ShapeDecorator(Shape decoratorShape) {
this.decoratedShape = decoratorShape;
}
@Override
public void draw() {
decoratedShape.draw();
}
}
class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratorShape) {
super(decoratorShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
上面代码的运行结果如下:

Java IO 库采用了装饰器模式(Decorator Pattern)和适配器模式(Adapter Pattern)的组合设计模式,其中InputStream是装饰器模式中顶层的抽象类,FilterInputStream是装饰器基类,BufferedInputStream是带有缓冲区的装饰器类,ObjectInputStream是可以读取对象的装饰器类,SequenceInputStream是可以顺序读取多个输入Stream的装饰器类,FileInputStream、ByteArrayInputStream则是被装饰的类。 这些类的UML图,如下所示:

上一篇:三、适配器模式
下一篇:没有了