现在思考这样一种情况,我们有一个接口a,用它来实现了若干接口bcd,如果我们想要给bcd加上一个功能且不改变现有类的结构的话,一个显然的想法是继承,将其作为子类,但是这样来讲不是很灵活
于是有了装饰器这一设计模式
一般来讲,我们为了给一个类增添新的功能通常采用继承模式,但是继承通常会为类引入静态特征,并且随着扩展功能的不断增加,子类会非常膨胀,如果想要在不继承类的情况下增加功能,一种较好的方式是增加装饰器模式
装饰类和被装饰类可以独立发展,不会相互耦合
以Shape为例
一边看代码一边解释吧
package interfaceFile;
public interface Shape {
void draw();
}
package InterfaceImpl;
import interfaceFile.Shape;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("circle");
}
}
package InterfaceImpl;
import interfaceFile.Shape;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("square");
}
}
现在的话我们有了两个Shape的实现类,如果我们想要扩展这个类,给他加上一个Function。我们首先要写一个抽象类
package InterfaceImpl;
import interfaceFile.Shape;
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape shape){
this.decoratedShape=shape;
}
@Override
public void draw(){
decoratedShape.draw();
}
}
然后继承这个抽象类
package InterfaceImpl;
import interfaceFile.Shape;
public class ShapeAddAFun extends ShapeDecorator{
public ShapeAddAFun(Shape shape) {
super(shape);
}
@Override
public void draw(){
decoratedShape.draw();
addAFun();
}
private void addAFun(){
System.out.println("Add a function!!!!");
}
}
测一下我们的结果
@Test
public void DemoTest(){
Circle circle=new Circle();
Square square=new Square();
circle.draw();
System.out.println("#######");
square.draw();
System.out.println("#######");
ShapeDecorator circleDecorator= new ShapeAddAFun(circle);
ShapeDecorator squareAddFun=new ShapeAddAFun(square);
circleDecorator.draw();
System.out.println("#######");
squareAddFun.draw();
}
circle
#######
square
#######
circle
Add a function!!!!
#######
square
Add a function!!!!
Process finished with exit code 0