1 介绍:
1.1 概念:装饰器模式允许向一个现有的对象添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,来包装原有的类,在保证方法签名完整的情况下,添加了额外的功能。
1.2 优缺点:
优点:装饰类和被装饰类独立发展,互不影响,装饰器模式是继承的一个很好的代替模式,可以很好的扩展一个实现类的功能。
缺点:多层装饰比较复杂
2.实现:
我们创建一个Shape接口和它的两个实现类Circle,Rectangle;然后创建一个实现了Shape接口的装饰抽象类DecoratorShape,并把shape对象作为它的变量,其实就是作为被装饰类。然后创建装饰类RedShapeDecorator继承了DecoratorShape。
Shape接口:
public interface Shape { void draw(); }
Circle类:
// 被装饰类
public class Circle implements Shape{ public void draw() { System.out.println("circle"); } }
Rectangle类:
// 被装饰类
public class Rectangle implements Shape{ public void draw() { System.out.println("rectangle"); } }
DecoratorShape抽象装饰类:
/** * @author chenyk * @date 2018年9月7日 * 抽象装饰类 */ public abstract class DecoratorShape implements Shape { //被装饰的类 protected Shape decoratedShape; public DecoratorShape(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw() { decoratedShape.draw(); } }
RedShapeDecorator装饰类:
public class RedShapeDecorator extends DecoratorShape{ public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } //在不改变被装饰类原有的方法下,又添加了新的方法 public void draw(){ decoratedShape.draw(); setRedBorder(); } //装饰类中额外的功能 public void setRedBorder(){ System.out.println("Border color:red"); } }
在场景类中运行:
public class DecoratorClient { public static void main(String[] args) {
// 装饰类包装了被装饰类,在不改变被装饰类的基础上,添加了额外的功能 Shape redCircle = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); redCircle.draw(); redRectangle.draw(); } }
原文出处:http://www.runoob.com/design-pattern/decorator-pattern.html