0
点赞
收藏
分享

微信扫一扫

设计模式-装饰器模式

小编 2022-04-13 阅读 82

装饰器模式

装饰器模式介绍

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

  • 不改变原有对象,扩展对象功能
  • 使用不同的组合可以实现不同效果
  • 符合开闭原则
  • 扩展一个类的功能或给一个类添加附加职责
  • Servlet

装饰器模式结构与实现

具体的装饰器角色可以相互嵌套!!一层层装饰!!

抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰器模式


/**
 * 抽象构件角色
 */
interface Component {
    void operation();
}

/**
 * 具体构件角色
 */
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("调用具体构件角色的方法");
    }
}

/**
 * 抽象装饰角色
 *  将抽象构建角色组合
 */
class Decorator implements Component {
    private Component component;
    public Decorator(Component component) {
        this.component = component;
    }
    @Override
    public void operation() {
        component.operation();
    }
}

/**
 * 具体装饰角色
 */
class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }
    @Override
    public void operation() {
        super.operation();
        // 在原方法后添加装饰方法
        decorate();
    }

    /**
     * 给原组件的方法 添加额外功能 装饰
     */
    public void decorate() {
        System.out.println("为具体构件角色装饰额外功能");
    }
}

public class DecoratorTemplateTest {
    public static void main(String[] args) {
        // 装饰前
        Component oldComponent = new ConcreteComponent();
        oldComponent.operation();

        System.out.println("--------------------");

        // 装饰后
        Component decoratedComponent = new ConcreteDecorator(new ConcreteComponent());
        decoratedComponent.operation();
    }

    /*
     * 调用具体构件角色的方法
     * --------------------
     * 调用具体构件角色的方法
     * 为具体构件角色装饰额外功能
     */
}


Component: 相机 Camera
ConcreteComponent: 移动手机 MobilePhone
Decorator: 相机装饰器 CameraDecorator
ConcreteDecorator: 滤镜相机 FilterCamera| 美颜相机 BeautyCamera

/**
 * 抽象构件角色:相机
 */
interface Camera {
    /**
     * 拍照
     */
    void takePhoto();
}

/**
 * 具体构件角色:手机
 *  实现 相机功能
 */
class MobilePhone implements Camera {
    @Override
    public void takePhoto() {
        System.out.println("用手机拍摄照片");
    }
}

/**
 * 抽象装饰角色:相机装饰器
 *  组合抽象角色 相机
 */
class CameraDecorator implements Camera {
    private Camera camera;
    public CameraDecorator(Camera camera) {
        this.camera = camera;
    }
    @Override
    public void takePhoto() {
        camera.takePhoto();
    }
}

/**
 * 具体装饰角色:相机装饰器子类->滤镜相机
 */
class FilterCamera extends CameraDecorator {
    public FilterCamera(Camera camera) {
        super(camera);
    }
    @Override
    public void takePhoto() {
        // 添加滤镜功能
        addCameraFilter();
        // 拍摄照片
        super.takePhoto();
    }

    /**
     * 给原相机的方法 添加额外功能 滤镜
     */
    public void addCameraFilter() {
        System.out.println("添加滤镜功能");
    }
}

/**
 * 具体装饰角色:相机装饰器子类->美颜相机
 */
class BeautyCamera extends CameraDecorator {
    public BeautyCamera(Camera camera) {
        super(camera);
    }
    @Override
    public void takePhoto() {
        // 添加美颜功能
        addCameraBeauty();
        // 拍摄照片
        super.takePhoto();
    }

    /**
     * 给原相机的方法 添加额外功能 美颜
     */
    public void addCameraBeauty() {
        System.out.println("添加美颜功能");
    }
}

public class CameraDecoratorTest {
    public static void main(String[] args) {
        // 原相机
        Camera oldCamera = new MobilePhone();
        oldCamera.takePhoto();

        System.out.println("--------------------");

        // 装配滤镜功能的相机
        Camera filterCamera = new FilterCamera(new MobilePhone());
        filterCamera.takePhoto();

        System.out.println("--------------------");

        // 装配美颜功能的相机
        Camera beautyCamera = new BeautyCamera(new MobilePhone());
        beautyCamera.takePhoto();

        System.out.println("--------------------");

        // 装配滤镜和美颜功能的相机 [嵌套装饰器!!!]
        Camera filterAndBeautyCamera = new FilterCamera(new BeautyCamera(new MobilePhone()));
        filterAndBeautyCamera.takePhoto();
    }

    /*
        用手机拍摄照片
        --------------------
        添加滤镜功能
        用手机拍摄照片
        --------------------
        添加美颜功能
        用手机拍摄照片
        --------------------
        添加滤镜功能
        添加美颜功能
        用手机拍摄照片
     */
}
举报

相关推荐

0 条评论