装饰模式(Decorator Pattern):为已有功能动态地添加更多功能的一种方式
Attach additional responsiblities to an object dynamically keeping the same interface. Decorator provide a flexible alternative to subclassing for extending functionality.

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

装饰模式的四个角色:

抽象构件(Component)角色:规范需要装饰的对象(原始对象)
具体构件(Concrete Component)角色:实现抽象构件接口,定义一个需要装饰的原始类
抽象装饰(Decorator)角色:定义一个与抽象构件接口一致的接口,并拥有一个构件对象的实例
具体装饰(Concrete Decorator)角色:实现抽象装饰接口,负责对构建对象进行装饰
装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象。

装饰模式把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责与装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。

基本代码实现:

public class DecoratorModel {
/**
* 装饰模式
*/
public static void main(String[] args) {
//1、创建具体构建对象
ConcreteComponent component=new ConcreteComponent();
//2、用装饰A对对象进行包装
ConcreteDecoratorA decoratorA=new ConcreteDecoratorA(component);
//3、在装饰A的基础上用装饰B对对象进行包装
ConcreteDecoratorB decoratorB=new ConcreteDecoratorB(decoratorA);
//4、开始装饰
decoratorB.operation(www.dfgjpt.com/);
}
}

//抽象构建角色
interface Component{
public void operation();
}

//具体构建角色
class ConcreteComponent implements Component{
@Override
public void operation() {
//初始业务代码
System.out.println("具体角色的初始构建");
}
}

//抽象装饰角色
abstract class Decorator implements Component{
private Component component=null;
public Decorator(www.leyou2.net Component component){
this.component=component;
}
public void operation(www.thd540.com){
this.component.operation(www.zhongdayule.cn);
}
}

//具体装饰角色A
class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
//定义新增的操作
private void addOper(){
System.out.println("具体角色的A装饰");
}
//重写operation方法
public void operation(){
super.operation();//先对对象进行初始化构建
this.addOper();
}
}

//具体装饰角色B
class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Component component) {
super(component);
}
//定义新增的操作
private void addOper(){
System.out.println("具体角色的B装饰");
}
//重写operation方法
public void operation(){
super.operation();//先对对象进行初始化构建
this.addOper();
}
}
运行结果:

具体角色的初始构建
具体角色的A装饰
具体角色的B装饰
在Java.io包中,很多类的设计,都用到了装饰器模式(如Reader相当于抽象的被装饰者,FileReader相当于具体的被装饰者,BufferedReader相当于装饰)。

设计模式(Java随笔)—装饰模式的更多相关文章

  1. 【视频】设计模式(Java)视频讲解

    设计模式(JAVA) 视频网址: http://www.qghkt.com/ 设计模式(JAVA)视频地址: https://ke.qq.com/course/318643?tuin=a508ea62 ...

  2. Java设计模式学习记录-装饰模式

    前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...

  3. 《Java设计模式》之装饰模式

    装饰模式(Decorator) 1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.   ...

  4. 《JAVA设计模式》之装饰模式(Decorator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  5. java设计模式-----7、装饰模式

    首先,什么是装饰者模式呢??? 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator ...

  6. Java描述设计模式(09):装饰模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领.他变成鱼儿时,就可以到水里游泳:他变成鸟儿时,就可以 ...

  7. java常用设计模式七:装饰模式

    一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...

  8. Java之装饰模式

    1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...

  9. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. js 获取当前年月日时分秒星期

    $("#aa").click(function () { var date = new Date(); this.year = date.getFullYear(); this.m ...

  2. GCD和NSThread延时执行对比

    1.NSThread: [self performSelector:@selector(performSome:) withObject:self afterDelay:.f]; [[self cla ...

  3. html5新结构标签

    html5新结构标签 <header>  定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...

  4. Ubuntu 开机启动不执行

    解决方案: 1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash" 2.将/bin/sh重新链接到/b ...

  5. 怎么删除服务中的mysql服务

    可以进WINDOWS的管理里查看MYSQL的服务,把它停止或以DOS下用命令停止1.如果要卸载MYSQL执行下面命令:DOS下>mysqld -remove mysql2.启动MYSQL: DO ...

  6. Python之路-时间模块

    time模块 import time 时间戳(time.time())--结构化时间(time.localtime)--字符串时间(time.strftime) import time print(t ...

  7. Geode 集群搭建,快速上手使用

    Geode 介绍: Geode是一个提供实时.一致访问大型分布式云平台下数据密集型应用的数据管理平台. Geode 通过跨多进程,把内存.CPU.网络资源和可选的本地磁盘汇集起来,来管理应用程序对象及 ...

  8. JDK1.8 HashMap$TreeNode.rotateLeft 红黑树左旋

    红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) ...

  9. Linux学习-什么是例行性工作排程

    那么 Linux 的例行性工作是如何进行排程的呢?所谓的排程就是将这些工作安排执行的流程之意! 咱们的 Linux 排程就是透过 crontab 与 at 这两个东西! Linux 工作排程的种类: ...

  10. 使用html+javascriptt实现的简易四则运算(初学JavaScript笔记)

    今天第一天学javascript,做了个简易的四则运算,提供参考,效果图: html代码: <!DOCTYPE html> <html > <head > < ...