美文网首页
装饰者模式(Decorator)

装饰者模式(Decorator)

作者: 群众里面有坏人呐 | 来源:发表于2018-12-25 09:54 被阅读0次

    定义

    动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。

    为什么要使用装饰者模式

    • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
    • 处理那些可以撤消的职责。
    • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

    角色

    1. 抽象组件:定义一个抽象接口,来规范准备附加功能的类
    2. 具体组件:将要被附加功能的类,实现抽象构件角色接口
    3. 抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口
    4. 具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。

    实例

    抽象组件

    public interface Shape {
        void draw();
    }
    

    具体组件

    public class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("shape: rectangle");
        }
    }
    

    抽象装饰者

    public abstract class ShapeDecorator implements Shape {
        protected Shape decoratedShape;
        public ShapeDecorator(Shape decoratedShape) {
            this.decoratedShape = decoratedShape;
        }
        public void draw(){
            decoratedShape.draw();
        }
    }
    

    具体装饰

    public class RedShapeDecorator extends ShapeDecorator {
        public RedShapeDecorator(Shape decoratedShape) {
            super(decoratedShape);
        }
        @Override
        public void draw(){
            decoratedShape.draw();
            setRedBorder(decoratedShape);
        }
        private void setRedBorder(Shape decoratedShape){
            System.out.println("Border Color: Red");
        }
    }
    

    测试代码

    public class Test {
        public static void main(String[] args) {
            Shape shape = new Rectangle();
            ShapeDecorator decorator = new RedShapeDecorator(shape);
            decorator.draw();
        }
    }
    

    运行结果

    shape: rectangle
    Border Color: Red
    

    相关文章

      网友评论

          本文标题:装饰者模式(Decorator)

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