顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!

其中类的职责如下:
 
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
 
二、装饰模式的使用
  Interface : Project

package edu.gof.decorator;

//抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
public interface Project { // 编写代码
void doCoding();
}

  Class : Employe

package edu.gof.decorator;

//具体构件角色(Employe):定义一个将要接收附加责任的类
public class Employe implements Project { // 真正的编码工作
public void doCoding() {
System.out.println("码农:佛祖保佑,没有BUG");
} }

  Class : Manager

package edu.gof.decorator;

//装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
public class Manager implements Project { // 实际上存放的是代码工人对象
private Project project; public Manager() {
super();
} public Manager(Project project) {
super();
this.project = project;
} // 编码,总揽大局。装饰编码过程。
public void doCoding() {
// 项目经理开始新的项目
this.startNewWork();
} // 模板:定义项目经理自己的事情
public void startNewWork() {
// 项目经理在做早期工作
this.doEarlyWork();
// 早期工作完成,交由码农开始真正的编码工作
this.project.doCoding();
// 项目经理在做收尾工作
this.doEndWork();
} // 项目经理的早期工作
public void doEndWork() { } // 项目经理的收尾工作
public void doEarlyWork() { } }

  Class : ManagerA

package edu.gof.decorator;

public class ManagerA extends Manager {

    public ManagerA() {
super();
} public ManagerA(Project project) {
super(project);
} public void doEarlyWork(){
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
} }

  Class : ManagerB

package edu.gof.decorator;

public class ManagerB extends Manager {

    public ManagerB() {
super();
} public ManagerB(Project project) {
super(project);
} public void doEarlyWork(){
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做架构设计");
} public void doEndWork(){
System.out.println("项目经理B 在做收尾工作");
} }

  Class : DecoratorTest

package edu.gof.decorator;

public class DecoratorTest {

    public static void main(String[] args){
Project ManagerA = new ManagerA(new Employe());
ManagerA.doCoding();
System.out.println("------------------------");
Project ManagerB = new ManagerB(new Employe());
ManagerB.doCoding();
}
}

  Console :

项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
码农:佛祖保佑,没有BUG
------------------------
项目经理B 在做需求分析
项目经理B 在做架构设计
码农:佛祖保佑,没有BUG
项目经理B 在做收尾工作

啦啦啦

GoF--装饰者设计模式的更多相关文章

  1. (java)从零开始之--装饰者设计模式

    装饰者设计模式:简单定义:增强一个类的功能,而且还可以让这些装饰类互相装饰. 应用场景:当要在某个功能的基础上扩充功能,并且扩充的功能具有大量排列组合,通过继承关系会衍生出大量子类,这时候用装饰者模式 ...

  2. 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题

    post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter  直接获取到的就是解决乱码后的数据 有 ...

  3. 设计模式--装饰者设计模式(Decorator)

    装饰者模式又叫包装模式. 通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果.   抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责 ...

  4. 42、Java装饰者设计模式

    设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼 ...

  5. 装饰器设计模式初探及Java中实际应用举例

    本篇随笔主要介绍用Java实现简单的装饰器设计模式: 先来看一下装饰器设计模式的类图:  从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可 ...

  6. GOF 23种设计模式目录

    经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...

  7. 11 IO流(八)——装饰器设计模式,Filter装饰流

    声明:本文部分图片及内容引用自:https://www.cnblogs.com/qiumingcheng/p/5219631.html java装饰器设计模式 举一个形象的例子,人可以说话,而扩音器可 ...

  8. Day 17:缓冲输出字符流和用缓冲输入输出实现登录、装饰者设计模式

    输出字符流 Writer  所有输出字符流的基类,  抽象类. FileWriter 向文件输出字符数据的输出字符流. BufferedWriter 缓冲输出字符流        缓冲输出字符流作用: ...

  9. GOF 23种设计模式

    设计模式目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Sin ...

  10. GoF 23种设计模式概述

    本文的结构: 一.设计模式总览 二.创建型设计模式 Creational Patterns 三.结构型设计模式 Structural Patterns 四.行为型设计模式 Behavioral Pat ...

随机推荐

  1. Visual Studio 2008 添加MScomm控件的方法

    1.下载MSCOMM.zip,解压后包含4个文件:MSCOMM32.OCX, MSCOMM.SRG, MSCOMM32.DEP, MSCOMM32.OCA 2.将Mscomm.srg, Mscomm3 ...

  2. Android 开发 打开默认浏览器发生崩溃

    Android 开发 打开默认浏览器发生崩溃. 代码如下: Intent intent = new Intent(); intent.setAction("Android.intent.ac ...

  3. SpringMVC深度探险(二) —— SpringMVC概览

    对于任何事物的研究,总是由表及里.由浅入深地进行.在本系列的第二篇文章中,我们将通过不同的观察视角,对SpringMVC做一些概要性的分析,帮助大家了解SpringMVC的基本构成要素.SpringM ...

  4. Sword pcre库使用

    #include <stdlib.h> #include <string.h> #include "regularhelper.h" #include &q ...

  5. 【Qt开发】QThread 实用技巧、误区----但文档中没有提到

    本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...

  6. 关于Python的装饰器 decorator

    装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...

  7. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  8. e834. 设置JTabbedPane中卡片的位置

    The tabs of a tabbed pane can be placed on one of the four edges of its container. By default, when ...

  9. 模式识别之bpnn---神经网络训练

    http://blog.csdn.net/linj_m/article/details/40679085

  10. firefox插件-HackBar介绍与试用

    This toolbar will help you in testing sql injections, XSS holes and site security. It is NOT a tool ...