详解java装饰模式(Decorator Pattern)
一、装饰器模式(DecoratorPattern)
允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的使用。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
二、实现
我们将创建一个Shape接口和实现了Shape接口的实体类。然后我们创建一个实现了Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量。
RedShapeDecorator是实现了ShapeDecorator的实体类。
DecoratorPatternDemo,我们的演示类使用RedShapeDecorator来装饰Shape对象。
步骤1
创建一个接口。
Shape.java
publicinterfaceShape{ voiddraw(); }
步骤2
创建实现接口的实体类。
Rectangle.java
publicclassRectangleimplementsShape{ @Override publicvoiddraw(){ System.out.println("Shape:Rectangle"); } }
Circle.java
publicclassCircleimplementsShape{ @Override publicvoiddraw(){ System.out.println("Shape:Circle"); } }
步骤3
创建实现了Shape接口的抽象装饰类。
ShapeDecorator.java
publicabstractclassShapeDecoratorimplementsShape{ protectedShapedecoratedShape; publicShapeDecorator(ShapedecoratedShape){ this.decoratedShape=decoratedShape; } publicvoiddraw(){ decoratedShape.draw(); } }
步骤4
创建扩展自ShapeDecorator类的实体装饰类。
RedShapeDecorator.java
publicclassRedShapeDecoratorextendsShapeDecorator{ publicRedShapeDecorator(ShapedecoratedShape){ super(decoratedShape); } @Override publicvoiddraw(){ decoratedShape.draw(); setRedBorder(decoratedShape); } privatevoidsetRedBorder(ShapedecoratedShape){ System.out.println("BorderColor:Red"); } }
步骤5
使用RedShapeDecorator来装饰Shape对象。
DecoratorPatternDemo.java
publicclassDecoratorPatternDemo{ publicstaticvoidmain(String[]args){ Shapecircle=newCircle(); ShaperedCircle=newRedShapeDecorator(newCircle()); ShaperedRectangle=newRedShapeDecorator(newRectangle()); System.out.println("Circlewithnormalborder"); circle.draw(); System.out.println("\nCircleofredborder"); redCircle.draw(); System.out.println("\nRectangleofredborder"); redRectangle.draw(); } }
步骤6
验证输出。
Circlewithnormalborder Shape:Circle Circleofredborder Shape:Circle BorderColor:Red Rectangleofredborder Shape:Rectangle BorderColor:Red
希望本文所述对大家学习java程序设计有所帮助。