设计模式-装饰模式(Decorator Pattern)

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

装饰模式有四个角色:
1.Component抽象构件
Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对
象。
2.ConcreteComponent 具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是
它。
3.Decorator装饰角色
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方
法呀,在它的属性里必然有一个private变量指向Component抽象构件。
4.具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最
原始的、最基本的东西装饰成其他东西。

具体请看例子:
Car

/**
 * @author shuliangzhao
 * @Title: Car
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:26
 */
public abstract class Car {

    public abstract void driver();
}

AudiCar

/**
 * @author shuliangzhao
 * @Title: AudiCar
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:27
 */
public class AudiCar extends Car {
    @Override
    public void driver() {
        System.out.println("速度为每小时50KM");
    }
}

DecoratorCar

/**
 * @author shuliangzhao
 * @Title: DecoratorCar
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:28
 */
public abstract class DecoratorCar extends Car{

    private Car car;

    public DecoratorCar(Car car) {
        this.car = car;
    }

    @Override
    public void driver() {
        car.driver();
    }
}

BlueAudiCar

/**
 * @author shuliangzhao
 * @Title: BlueAudiCar
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:31
 */
public class BlueAudiCar extends DecoratorCar {

    public BlueAudiCar(Car car) {
        super(car);
    }

    @Override
    public void driver() {
        this.color();
        super.driver();
    }

    private void color() {
        System.out.println("蓝色奥迪车");
    }
}
/**
 * @author shuliangzhao
 * @Title: BmwCar
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:30
 */
public class RedAudiCar extends DecoratorCar {

    public RedAudiCar(Car car) {
        super(car);
    }

    @Override
    public void driver() {
        this.color();
        super.driver();
    }

    private void color() {
        System.out.println("红色奥迪车");
    }
}

客户端

/**
 * @author shuliangzhao
 * @Title: Client
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/13 23:32
 */
public class Client {

    public static void main(String[] args) {
        Car car = new AudiCar();
        car.driver();
        Car redCar = new RedAudiCar(car) ;
        redCar.driver();
        Car blueCar = new BlueAudiCar(car);
        blueCar.driver();
    }
}

运行结果

image.png

装饰模式优点:

1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.可以动态扩展类。

装饰模式缺点:

多层的装饰是比较复杂。

装饰模式使用场景:

需要动态地给一个对象增加功能、需要扩展一个类的功能。

举个简单例子可以看出装饰模式的好处:三个继承关系Father、Son、GrandSon三个类,我要在Son类上增强一些功能怎么办?我想你会坚决地顶回去!不允许,对了,为什么呢?你增强的功能是修改Son类中的方法吗?增加方法吗?对GrandSon的影响呢?特别是GrandSon有多个的情况,你会怎么办?这个评估的工作量就够你受的,所以这是不允许的,那还是要解决问题的呀,怎么办?通过建立SonDecorator类来修饰Son,相当于创建了一个新的类,这个对原有程序没有变更,通过扩展很好地完成了这次变更。

注意:继承是静态地给类增加功能,而装饰模式则是动态地增加功能。

原文地址:https://www.cnblogs.com/treeshu/p/11020503.html

时间: 2024-10-17 03:52:13

设计模式-装饰模式(Decorator Pattern)的相关文章

设计模式之Decorator Pattern

Declaration 首先声明, 本篇blog的内容是参考Design pattern FAQ part 4 这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步. Scene for Decorator Pattern Decorator Pattern,也就是我们通常说的装饰者模式.最初学习设计模式的时候,就感觉这个模式很强大,但是总是没有找到合适的机会用. 装饰者模式希望做的是在运行中,动态的堆叠增加一些行为,从而改变

设计模式--装饰模式(Decorator)

装饰模式(Decorator) : 动态的给一个对象加入一些额外的职能,就添加功能来说,装饰模式比生成子类更为灵活. 实例: ConcreteComponent:让Decorator对象为自己加入功能.有时候使用ConcreteComponent的派生类提供核心功能.在这样的情况就是用ConcreteComponent替代了Component的功能,并且装饰者是继承于ConcreteComponent的子类. Component:定义ConcreteComponent和Decorator类要实现

[设计模式]<4>. C++与装饰模式(decorator pattern)

原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5612028.html 装饰模式是指,动态的为一个类增加职责(相对于继承). 截自<设计模式>装饰者的UML图 举个栗子,

设计模式实现C++ --装饰模式Decorator Pattern

定义:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 类图: Component:定义一个对接接口,可以给这些对象动态的添加职责: ConcreteComponent:定义一个具体的对象,也可以给对象添加一些职责: Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能,对于Component来说无需知道Decorator的存在: ConcreteDecorator:具体的装饰对象,起到给Component添加职责的功能:

装饰模式(Decorator pattern)

装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展.装饰模式的类图如下: 在装饰模式中的角色有: 抽象构件(Component)角色:给出一个抽象组件接口,以规范准备接收附加责任的对象,即可以给这些对象动态地添加职责. 具体构件(Concret

[工作中的设计模式]装饰模式decorator

一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对象接口: 2.装饰者对象与原有对象需要继承相同接口,初始化装饰对象时将原有对象传入装饰对象: 3.可以对一个对象定义多个装饰着对象,进行分别装饰或者组合装饰 二.模式代码 1.抽象接口 package decorator.patten; public interface Component { pu

DesignPattern_Java:Decorator Pattern

装饰模式 Decorator Pattern Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality. 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活. 抽象构建角色(Compon

NET设计模式 第二部分 结构性模式(9):装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern) ——.NET设计模式系列之十 Terrylee,2006年3月 概述 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀.如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?这就是本文要讲的Decorat

第 13 章 装饰模式【Decorator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’m going to talk about decoratorpattern.装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方