设计模式 -- 装饰者模式

96 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

基本介绍

1)装饰者模式的意图在于可以动态的给一个对象添加额外的职责,同时不改变其结构。

2)是一种创建型模式

3)装饰者模式通过组合的方式扩展对象的特性,这种方式允许我们在任何时候对对象的功能进行扩展甚至是运行时扩展,而我们用继承来完成对类的扩展则只能在编译阶段实现。

外观模式的注意事项和细节

1)就功能而言,外观模式可以动态的给对象添加职责,相比生成子类更为灵活

2)主要解决问题,防止由于继承为类引入静态特征,导致子类膨胀

3)优点,装饰类和被装饰类可以独立发展,不相互耦合

4)缺点:多装饰层比较复杂,对于一些特别相像的对象,排错也变得困难

类图

1.png

案例代码

package com.example.demo.design.decorator;

public class Airplane extends Changer{

    public Airplane(Transform transform) {
        super(transform);
    }

    @Override
    public void move() {
        fly();
        transform.move();
    }

    private void fly(){
        System.out.println("Airplane fly");
    }
}

package com.example.demo.design.decorator;

public class Car implements Transform{
    @Override
    public void move() {
        System.out.println("Car move");
    }
}

package com.example.demo.design.decorator;


public abstract class Changer implements Transform{

    protected Transform transform;

    public Changer(Transform transform){
        this.transform = transform;
    }

    public void move(){
        transform.move();
    }
}

package com.example.demo.design.decorator;

public class Robot extends Changer{

    public Robot(Transform transform) {
        super(transform);
    }

    @Override
    public void move() {
        say();
        transform.move();
    }

    private void say(){
        System.out.println("Robot Say");
    }
}

package com.example.demo.design.decorator;

public interface Transform {
    void move();
}

package com.example.demo.design.decorator;

public class DemoMain {
    public static void main(String[] args) {
        Transform car = new Car();

        Changer robot = new Robot(new Car());
        Changer airplane = new Airplane(new Car());

        System.out.println("-----");
        System.out.println("汽车跑了");
        car.move();

        System.out.println("-----");
        System.out.println("机器人说骑车跑了");
        robot.move();

        System.out.println("-----");
        System.out.println("飞机飞走了,骑车跑了");
        airplane.move();
    }
}

结果 2.png

装饰者模式在jdk中的应用

Java的IO结构,FilterInputStream就是一个装饰者

3.png