设计模式-10 装饰模式(结构型模式)

一 装饰模式

  装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

关键代码:1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

使用场景:

孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能
1、扩展一个类的功能。 2、动态增加功能,动态撤销

类图 :

二 实现代码

1 创建一个Shape接口

Shape.java

public interface Shape {
    void draw();
}

2 创建实现接口的实体类

Rectangle.java

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

Circle.java

public class Circle implements Shape {
    public void draw() {
        System.out.println("Shape: Circle");
    }
}

3 创建实现了 Shape 接口的抽象装饰类

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    public void draw() {
        decoratedShape.draw();
    }
}

4 创建扩展了 ShapeDecorator 类的实体装饰类

RedShapeDecorator.java

public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    public void draw() {
        decoratedShape.draw();
        setRedBorder(decoratedShape);
    }

    private void setRedBorder(Shape decoratedShape) {
        System.out.println("Border Color: Red");
    }
}

5 运行测试类

使用 RedShapeDecorator 来装饰 Shape 对象

public class DecoratorPatternDemo {
    public static void main(String[] args) {

        Shape circle = new Circle();

        Shape redCircle = new RedShapeDecorator(new Circle());

        Shape redRectangle = new RedShapeDecorator(new Rectangle());
        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();
    }
}

下一篇 设计模式-11 外观模式(结构型模式)

时间: 2025-01-04 07:00:14

设计模式-10 装饰模式(结构型模式)的相关文章

Java经典设计模式之七大结构型模式(附实例和详解)

博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没事做看看也是没有坏处的. 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解).

GOF 23设计模式之(结构型模式二)

目录 1.装饰模式 2.外观模式 3.享元模式 4.组合模式 4.1透明方式 4.2安全方式 一.装饰模式(Decorator) 可以动态的为对象添加新的功能,是一种用于代替继承的技术,无须通过继承添加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系.同时避免类型体系的快速膨胀. 核心角色: (1)抽象构件角色(Component):定义一个抽象的接口以规范准备接收附加责任的对象. (2)具体构件角色(Concrete Component):实现抽象化构件,通过装饰角色为其添加一些职责.

第10章 结构型模式—组合模式

1. 组合模式(Composite Pattern)的定义 (1)将对象组合成树型结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. (2)组合模式的结构和说明 ①Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. ②Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他子节点对象. ③Composite:组合对象,通常会存储子组件,定义包含子组件的那

设计模式-Bridge(结构型模式)-用于客户需求较多,频繁对类进行添加修改的情形,将抽象类与具体实现类分开

以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //AbstractionImp.h #pragma once class AbstractionImp { public: virtual ~AbstractionImp(); virtual void Operation() = 0; protected: AbstractionImp(); private: }; class ConcreateAbstractionImpA :public AbstractionIm

GOF 23设计模式之(结构型模式一)

目录 1.代理模式 1.1静态代理 1.2动态代理 2.适配器模式 2.1类适配器模式 2.2对象适配器模式 2.3双向适配器模式 3.桥接模式 一.代理模式(Proxy) 访问者对象不适合或者不能直接引用目标对象,需要通过代理对象作为访问对象和目标对象之间的中介.并且可以设置一些前置设置.后置处理.通俗来说,代理模式就像生活中的中介. 可以分为:静态代理.动态代理 核心角色: (1)抽象主题类(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法 (2)真实主题类(Real

结构型模式:代理模式

文章首发: 结构型模式:代理模式 七大结构型模式之七:代理模式. 简介 姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 : Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问. (来自<设计模式之禅>) 你要的故事 咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的

设计模式(八) : 结构型模式--装饰模式

装饰模式的目的是为了给一个对象动态的增加一些功能.装饰对象和被装饰的对象实现同一个接口,装饰对象持有被装饰对象的实例. 类图: 示意性代码: package com.javadesignpattern.Decorator; public interface Component { void sampleOperation(); } package com.javadesignpattern.Decorator; public class ConcreteComponent implements

设计模式09: Decorator 装饰模式(结构型模式)

Decorator 装饰模式(结构型模式) 子类复子类,子类何其多加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路两栖功能,比如卫星定位功能等等. 问题代码: /// <summary> /// 抽象坦克 /// </summary> public abstract class Tank { public abstract void Shot(); public abstract void Run(

(转)Java经典设计模式(2):七大结构型模式(附实例和详解)

原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解). 接下来我们看看结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中适配器模式主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.其中的对象的适配器