装饰模式(Decorator Pattern) – 设计模式之结构型模式

装饰模式(Decorator Pattern) – 设计模式之结构型模式:

 目录

装饰模式(Decorator Pattern)

类图

例子-画图:

过程:

类图:

代码:

形状 Shape

圆形  Circle 具体构件  ConcreteComponent

三角形 Triangle

抽象装饰者 Decorator

粉红色装饰 PinkDecorator

花环装饰 FlowerDecorator

动画装饰 AnimationDecorator

测试:

结果:

总结:

使用场景


装饰模式(Decorator Pattern)

定义: Attach additional responsibilities to an object dynamically keeping the same interface. Decoratiors provide a flexible alternative to subclassing for extending functionality.

动态地给一个对象添加一些额外的职权,就增加功能来说,装饰模式比生成子类更为灵活。 若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

  通常装饰模式是采用抽象类,但是在Java中可以使用接口,但我们应避免修改现有的代码。如果抽象类运作得好好的,还是别去修改它。

  意图:不改变接口,但是添加责任

类图

装饰模式通用类图:

 

 

例子-画图:

过程:

  给形状加一些色彩,边框样式,动画等内容

 

类图:

 

代码:

形状 Shape

public interface Shape {

   void draw();

}

 

圆形  Circle 具体构件  ConcreteComponent

具体构件  ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。

public class Circle implements Shape {

    @Override

    public void draw() {

        System.out.println("形状是圆形的: ○○○○○");

    }

}


三角形 Triangle

public class Triangle implements Shape {

    @Override

    public void draw() {

        System.out.println("形状是三角形的: △△△△△");

    }

}

 

抽象装饰者 Decorator

一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component抽象构件

public abstract class ShapeDecorator implements Shape {

    protected Shape shape;

    public ShapeDecorator(Shape shape){

        this.shape = shape;

    }

    @Override

    public void draw() {

        shape.draw();

    }

}
 

粉红色装饰 PinkDecorator

public class PinkDecorator extends ShapeDecorator{

    PinkDecorator(Shape shape) {

        super(shape);

    }

    @Override

    public void draw() {

        shape.draw();

        System.out.println(" 涂上粉红色 pink color");

    }

}

 

花环装饰 FlowerDecorator

public class FlowerDecorator extends ShapeDecorator{

    FlowerDecorator(Shape shape) {

        super(shape);

    }

    @Override

    public void draw() {

        shape.draw();

        System.out.println(" 给边框加上花环");

    }

}

 

动画装饰 AnimationDecorator

public class AnimationDecorator extends ShapeDecorator{

    AnimationDecorator(Shape shape) {

        super(shape);

    }

    @Override

    public void draw() {

        shape.draw();

        System.out.println("加上动画的跳动");

    }

}

 

测试:

public class ShapeDecoratorTest {

   public static void main(String[] args) {

      System.out.println("======== 圆形 =========");

      Shape circle = new Circle();

      ShapeDecorator shapeDecorator = new PinkDecorator(new FlowerDecorator(circle));

      shapeDecorator.draw();

      System.out.println("======== 三角形 =========");

      Shape triangle = new Triangle();

      shapeDecorator = new AnimationDecorator(new FlowerDecorator(new PinkDecorator(triangle))) ;

      shapeDecorator.draw();

   }

}

 

结果:

======== 圆形 =========

形状是圆形的: ○○○○○

 给边框加上花环

 涂上粉红色 pink color

======== 三角形 =========

形状是三角形的: △△△△△

 涂上粉红色 pink color

 给边框加上花环

加上动画的跳动

 

总结:

 

优点:

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

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

 

使用场景

   1,需要扩展一个类的功能,或给一个类增加附加功能。

   2,需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

   3,需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式

 

   装饰模式是对继承的有力补充,可以替代继承,解决类膨胀的问题。

 

   实际应用:半透明装饰者模式 – inputStream

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值