`

2. 结构型模式 (2) 装饰者模式

阅读更多
2. 结构型模式 (2) 装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

在不想增加很多子类的情况下扩展类。一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

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


1. 装饰器模式

package com.andrew.pattern0202.decorator.modal01;
public interface Shape {
    void draw();
}

package com.andrew.pattern0202.decorator.modal01;
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Shape: Rectangle");
    }
}

package com.andrew.pattern0202.decorator.modal01;
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Shape: Circle");
    }
}


package com.andrew.pattern0202.decorator.modal01;
public class ShapeDecorator implements Shape {
    protected Shape decoratedShape;
    public ShapeDecorator(Shape decoratedShape){
        this.decoratedShape = decoratedShape;
    }
    @Override
    public void draw() {
        decoratedShape.draw();
    }
}


package com.andrew.pattern0202.decorator.modal01;
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");
    }
}


package com.andrew.pattern0202.decorator.modal01;
/**
 * 1. 装饰者模式
 * 
 * @author andrew
 * @date 2017/06/26
 */
public class DecoratorTest {
    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("Circle of red border");
        redCircle.draw();
        System.out.println("Rectangle of red border");
        redRectangle.draw();
    }
}
运行结果:
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red


2. 装饰器模式
package com.andrew.pattern0202.decorator.modal02;
public interface Component {
    public void doSomething();
}

package com.andrew.pattern0202.decorator.modal02;
public class ConcreteComponent implements Component {
    @Override
    public void doSomething() {
        System.out.println("基本功能");
    }
}


package com.andrew.pattern0202.decorator.modal02;
public class Decorator implements Component {
    private Component component;
    public Decorator(Component component) {
        this.component = component;
    }
    @Override
    public void doSomething() {
        component.doSomething();
    }
}


package com.andrew.pattern0202.decorator.modal02;
public class ConcreteDecorator1 extends Decorator {
    public ConcreteDecorator1(Component component) {
        super(component);
    }
    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }
    private void doAnotherThing() {
        System.out.println("附加功能1");
    }
}

package com.andrew.pattern0202.decorator.modal02;
public class ConcreteDecorator2 extends Decorator {
    public ConcreteDecorator2(Component component) {
        super(component);
    }
    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }
    private void doAnotherThing() {
        System.out.println("附加功能2");
    }
}


package com.andrew.pattern0202.decorator.modal02;
/**
 * 2. 装饰者模式
 * 
 * @author nxf46916
 * @date 2017/06/26
 */
public class Client {
    public static void main(String[] args) {
        // 节点流
        Component component = new ConcreteComponent();
        // 过滤流
        Component component2 = new ConcreteDecorator1(component);
        component2.doSomething();
        System.out.println("------------");
        // 过滤流
        Component component3 = new ConcreteDecorator2(component2);
        component3.doSomething();
        System.out.println("------------");
        Component component11 = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent()));
        component11.doSomething();
    }
}
运行结果:
基本功能
附加功能1
------------
基本功能
附加功能1
附加功能2
------------
基本功能
附加功能2
附加功能1
分享到:
评论

相关推荐

    [结构型模式] 装饰者模式的理解

    装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...

    软件设计模式实验2结构型模式源码

    电子商务网站常有这样的功能:发送消息通知,比如订货发货通知等,从业务上看,消息分为普通消息、加急消息和特急消息多种不同的消息类型,其业务处理是不一样的,比如加急消息是在消息上添加加急标记.....2....

    java 23种设计模式.zip

    2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    23种设计模式 (创建型,结构型,行为型)

    结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight ...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    设计模式_结构型_装饰者模式.md

    装饰者模式是一种结构型设计模式,它允许用户在不改变原有对象的基础上动态地添加额外的职责或行为。与通过继承扩展功能相比,装饰者模式提供了更灵活的扩展方式。 #### 定义与概念 装饰者模式主要由以下几个核心...

    设计模式之结构型模式

    在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...

    设计模式之结构型模式uml类图EA文件.rar

    在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    c++设计模式-结构型模式-装饰器模式

    c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

    设计模式(创建型、结构型、行为型)

    结构型模式是指在软件设计中,如何将类组合在一起去构成更大的结构的模式。它主要解决了类之间的组合问题,包括适配器、桥接、组合、装饰、外观、飞weight和代理等七种模式。 行为型模式是指在软件设计中,如何定义...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    13.装饰者模式.doc

    这种模式遵循“开闭原则”,即对扩展开放,对修改关闭,是结构型模式的一种。 在装饰者模式中,有四个主要角色: 1. 抽象构件角色(Component):这是所有组件对象的基类或接口,定义了对象的基本行为和共同接口。...

    新版设计模式手册 通俗的例子讲述设计的方法 1创建型模式 2结构型模式 3 行为模式 详细的设计说明

    这个“新版设计模式手册”深入浅出地介绍了设计模式的三大类:创建型模式、结构型模式和行为模式,为开发者提供了一套详细的设计说明。 一、创建型模式 创建型模式主要关注对象的创建过程,它们的目标是使得对象的...

    C#设计模式源代码1.简单工厂模式 2.工厂方法模式 ...11种

    10. **外观模式**:也称为门面模式,结构型模式之一,提供了一个统一的接口,用来访问子系统的一组接口。外观模式简化了子系统与客户端之间的交互。 11. **桥接模式**:结构型模式,它将抽象部分与实现部分分离,使...

Global site tag (gtag.js) - Google Analytics