设计模式-装饰模式

原创 2017年11月14日 23:13:14

在上一篇文章中我总结了下策略模式,这边文章我来回顾一下装饰模式。
装饰模式:动态的给对象增加一些额外的职责。
这里写图片描述

在这个概念中有两个重要的词 动态和额外。动态 具体变现在实际业务流程中可以根据业务需要对一个ConcreteComponent 对象进行任意次数的增加装饰。额外 代表的是与业务主体所要处理的核心业务无关的装饰部分,例如:模特走台核心的行为是走秀,在走秀之前我们要为模特进行化妆和选衣搭配等装饰行为。这个模式的核心在于将为促成某一目的的行为分出装饰部分和核心部分,从而避免在核心职责中引入过多的装饰部分使得核心职责过于冗杂。

package decorator;

/**
 * @author Created by yanjy on 2017/11/14.
 */
public interface Model {
    void show();
}

package decorator.impl;

import decorator.Model;

/**
 * @author Created by yanjy on 2017/11/14.
 */
public class FashionModelImpl implements Model {
    @Override
    public void show() {
        System.out.println("hi guys Look at me, i`m the fashion!");
    }
}

package decorator.impl;

import decorator.AbstractDecorator;

/**
 * @author Created by yanjy on 2017/11/14.
 */
public class WearClothesDecoratorImpl extends AbstractDecorator {
    @Override
    public void show() {
        System.out.println("please wear the clothes firstly");
        model.show();
    }
}

package decorator.impl;

import decorator.AbstractDecorator;

/**
 * @author Created by yanjy on 2017/11/14.
 */
public class WearShoesDecoratorImpl extends AbstractDecorator {

    @Override
    public void show() {
        System.out.println("please wear the shoes secondly");
        model.show();
    }
}

package decorator;

import decorator.impl.FashionModelImpl;
import decorator.impl.WearClothesDecoratorImpl;
import decorator.impl.WearShoesDecoratorImpl;

/**
 * @author Created by yanjy on 2017/11/14.
 */
public class Stage {

    public static void main(String[] args) {
        Model model = new FashionModelImpl();

        AbstractDecorator clothesDecorator = new WearClothesDecoratorImpl();
        AbstractDecorator shoesDecorator = new WearShoesDecoratorImpl();

        clothesDecorator.decorator(model);
        shoesDecorator.decorator(clothesDecorator);

        shoesDecorator.show();
    }

}

在使用装饰模式的时候一定要时刻注意装饰的顺序,以免造成逻辑上的混乱。例如:我们在做数据分析的时候,一般分为数据采集,数据清洗,数据归类,数据分析。前三个可以称之为装饰,切顺序极为重要。如果在数据采集后直接归类会导致很多脏数据的流入分类的数据中,对数据清洗造成极大的困难。

本文参考了
《大话设计模式》
http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html
特此表示鸣谢

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2978

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

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 18717

设计模式-装饰者模式(Go语言描述)

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为...
  • qibin0506
  • qibin0506
  • 2016年04月07日 08:55
  • 5381

简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 15:34
  • 1023

调侃《HeadFirst设计模式》之装饰者模式

今天让我们继续跟随《Head First 设计模式》的足迹,聊一个新的设计模式,有了它,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。首先,按照惯例,从故事说起——    ...
  • sinat_23092639
  • sinat_23092639
  • 2015年04月05日 10:52
  • 877

设计模式-装饰模式(理解)

看了《大话设计模式》pdf版的装饰模式和其他博客上的一些讲解,第一遍很难get到讲解的点在哪。经国深思,记录下深思的结果。 装饰模式,其实就是用递归的方式实现了面向切面(接口)编程。面向切面...
  • Scalaaaaaa
  • Scalaaaaaa
  • 2016年07月12日 15:22
  • 265

各个设计模式的优缺点

设计原则 1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 2、针对接口编程(实际上是针对超类编程),而不是针对实现编程。 策略模式(Strategy Patter...
  • w302974215
  • w302974215
  • 2015年11月02日 14:04
  • 2843

设计模式练习(9)——装饰模式

装饰模式 一、题目:简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人,而现在我们需要为该手机添加一项功能,在接收来电的时候,除了有声音,还能产生震动(JarPhone),还...
  • qq_33220449
  • qq_33220449
  • 2017年01月20日 15:30
  • 783

[设计模式]-装饰器模式(Decorator)

定义: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 对象结构型模式...
  • qust_2011
  • qust_2011
  • 2016年11月30日 19:15
  • 515

23种设计模式-17-装饰模式

目录(?)[-] 一装饰模式简介Brief Introduction二解决的问题What To Solve三装饰模式分析Analysis 装饰模式结构源代码程序运行结果 四案例分析Exa...
  • a925907195
  • a925907195
  • 2014年12月15日 20:10
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式-装饰模式
举报原因:
原因补充:

(最多只允许输入30个字)