设计模式---装饰模式

目录

介绍

实现

优缺点


装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

介绍

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活。

主要解决:我们扩展一个类常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会越来越膨胀。

如何使用:在不想增加很多子类的情况下扩展。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码:1. Component 类充当抽象角色,不应该具体实现。2. 修饰类引用合继承 Component 类,具体扩展类重写父类方法。

使用场景:1. 扩展一个类的功能。2. 动态增加功能,动态撤销。

实现

创建一个 Shape 接口合实现了 Shape 接口的实体类。然后再创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。RedShapeDecorator 是实现了 ShapeDecorator 的实体类。DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象。

设计模式---装饰模式_第1张图片

 步骤1:

public interface Shape{
    void draw();
}

步骤2:

public class Rectangle implements Shape{

    @Override
    public ovid draw(){
        System.out.println("draw Rectangle");
    }
}
public class Cricle implements Shape{

    @Override
    public ovid draw(){
        System.out.println("draw Circle");
    }
}

步骤3:

public abstract class ShapeDecorator implements Shape{
    private Shape shape; // 持有一个 Shape 对象

    public ShapeDecorator(Shape shape){
        this.shape = shape;
    }

    public void draw(){
        shape.draw();// TODO 根据传进来的具体 Shape 对象,调用对应的 draw 方法
    }
}

 步骤4:

public class RedShapeDecorator extends ShapeDecorator{
    
    public RedShapeDecorator(Shape shape){
        super(shape);
    }

    @Override
    public void draw(){
        shape.draw();
        setRedBorder(shape);
    }

    public void setRedBorder(Shape shape){
        System.out.println("Border Color: Red");
    }
}

 步骤5

public class DecoratorPatterndDemo{

    public static void main(String args[]){
        //TODO 面向抽象层编程

        // 普通的Circle
        Shape circle = new Circle();
        System.out.println("Circle with normal Border");        
        circle.darw();

        // 红色边界的 Circle
        ShapeDecorator redCircle = new RedShapeDecorator(new Circle); 
        System.out.println("Circle of red Border");
        redCircle.draw();

        // 红色边界的 Rectangle
        ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangel):
        System.out.println("Rectangle of red Border");
        redRectangle.draw();
    }
}

优缺点

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

你可能感兴趣的:(软件设计模式,设计模式)