美文网首页Java设计模式
Java实现23种设计模式(八):装饰器模式

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

作者: 依然慢节奏 | 来源:发表于2020-06-10 10:24 被阅读0次

    二十三种设计模式分类

    设计模式三大分类.jpg

    一、概述

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

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

    优点

    • 采用装饰模式扩展对象的功能比采用继承方式更加灵活。
    • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。

    缺点

    • 多层装饰比较复杂。
    • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。

    场景

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


    二、实现

    1. 结构图

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

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

    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==============");
        }
    }
    
    • Main主类
    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();
        }
    }
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/nspazhtx.html