Java设计模式

Java实现23种设计模式(八):装饰器模式

2020-06-10  本文已影响0人  依然慢节奏

二十三种设计模式分类

设计模式三大分类.jpg

一、概述

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

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。

优点

缺点

场景

1、扩展一个类的功能。
2、动态增加功能,动态撤销。


二、实现

1. 结构图

装饰模式主要包含以下角色:

装饰器模式

PS:UML结构图可以参考,例子实现并不根据UML图来完成,灵活实现即可;

2. 实现

package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:33
 * description:
 **/

public abstract class Shape {
    public abstract void draw();
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:33
 * description:
 **/

public class CircleShape extends Shape {
    @Override
    public void draw() {
        System.out.println("Shape:Circle");
    }
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:34
 * description:
 **/

public class RectangleShape extends Shape {
    @Override
    public void draw() {
        System.out.println("Shape:Rectangle");
    }
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:28
 * description:
 * 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活
 **/

public abstract class AbstractShapeDecorator extends Shape{
    /**通过组合来添加装饰,将具体的功能和装饰分隔开*/
    protected Shape decoratorShape;

    public AbstractShapeDecorator(Shape decoratorShape) {
        this.decoratorShape = decoratorShape;
    }

    @Override
    public void draw() {
        ///具体功能实现
        decoratorShape.draw();
    }
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:36
 * description:
 **/

public class CircleShapeDecorator extends AbstractShapeDecorator {
    public CircleShapeDecorator(Shape decoratorShape) {
        super(decoratorShape);
    }

    @Override
    public void draw() {
        setStartLine();
        setRedBorder();
        super.decoratorShape.draw();
        setEndLine();
    }

    private void setRedBorder(){
        System.out.println("Decorator Circle Border:Red");
    }

    private void setStartLine(){
        System.out.println("=============Circle Start==============");
    }

    private void setEndLine(){
        System.out.println("=============Circle End==============");
    }
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:39
 * description:
 **/

public class RectangleShapeDecorator extends AbstractShapeDecorator {

    public RectangleShapeDecorator(Shape decoratorShape) {
        super(decoratorShape);
    }

    @Override
    public void draw() {
        setStartLine();
        setRedBorder();
        super.decoratorShape.draw();
        setEndLine();
    }

    private void setRedBorder(){
        System.out.println("Decorator Rectangle Border:Red");
    }

    private void setStartLine(){
        System.out.println("=============Rectangle Start==============");
    }

    private void setEndLine(){
        System.out.println("=============Rectangle End==============");
    }
}
package cn.missbe.model.decorator;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午5:39
 * description:
 * 装饰模式
 **/

public class Main {
    public static void main(String[] args) {
        Shape circle = new CircleShape();
        AbstractShapeDecorator redCircle = new CircleShapeDecorator(new CircleShape());
        AbstractShapeDecorator redRectangle = new RectangleShapeDecorator(new RectangleShape());
        System.out.println("Circle with normal border");
        circle.draw();

        System.out.println("\nCircle of red border");
        redCircle.draw();

        System.out.println("\nRectangle of red border");
        redRectangle.draw();
    }
}
上一篇下一篇

猜你喜欢

热点阅读