编程模式之装饰模式(Decorator)
装饰模式由四个角色组成:抽象组件角色,抽象装饰者角色,具体组件角色,具体装饰者角色。
抽象组件角色:给出一个抽象接口,以规范“准备接受附加功能”的对象。
抽象装饰者角色:持有一个组件(Component)对象的引用,并定义一个与抽象组件接口一致的接口。
具体组件角色:定义一个准备接受附加功能的类。
抽象装饰者角色:负责给组件对象“贴上”附加的责任。
类图:

JAVA代码:
Conponent.java
package com.decorator; public interface Component
{
void doSomeThing();
}
ConcreteConponent.java
package com.decorator; public class ConcreteComponent implements Component
{ @Override
public void doSomeThing()
{
System.out.println("功能A");
} }
Decorator.java
package com.decorator; public class Decorator implements Component
{
private Component component; //待修饰对象的一个引用 public Decorator(Component component)
{
this.component = component;
} @Override
public void doSomeThing()
{
this.component.doSomeThing();
} }
ConcreteDecorator1.java
package com.decorator; public class ConcreteDecorator1 extends Decorator
{ public ConcreteDecorator1(Component component)
{
super(component);
} @Override
public void doSomeThing()
{
super.doSomeThing();
doAnotherThing();
} private void doAnotherThing()
{
System.out.println("功能B");
}
}
ConcreteDecorator2.java
package com.decorator; public class ConcreteDecorator2 extends Decorator
{ public ConcreteDecorator2(Component component)
{
super(component);
} @Override
public void doSomeThing()
{
super.doSomeThing();
doAnotherThing();
} private void doAnotherThing()
{
System.out.println("功能C");
}
}
Test.java
package com.decorator; public class Test
{
public static void main(String[] args)
{
//ConcreteDecorator1对象装饰了ConcreteComponent对象
//ConcreteDecorator2对象又修饰了ConcreteDecorator1对象
//在不增加一个同时拥有ConcreteComponent、ConcreteDecorator1和ConcreteDecorator2三个类的功能
//于一身的一个“新的类”的情况下,通过修饰,实现了同时拥有这些功能
Component component = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent())); component.doSomeThing();
} }
总结:
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,其可以在不创造更多子类的情况下将对象的功能加以扩展。
编程模式之装饰模式(Decorator)的更多相关文章
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- 设计模式---单一职责模式之装饰模式(Decorator)
前提:"单一职责"模式 在软件组件的设计中,如果责任划分的不清晰,使用继承,得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任 典型模式(表现 ...
- 装饰模式/decorator模式/结构型模式
装饰模式Decorator 定义 为对象动态的增加新的功能,实现要求装饰对象和被装饰对象实现同一接口或抽象类,装饰对象持有被装饰对象的实例. java实现要点 定义一个接口或抽象类,作为被装饰者的抽象 ...
- 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)
结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 结构 ...
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- [工作中的设计模式]装饰模式decorator
一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...
- 装饰模式decorator
C++设计模式——装饰模式 前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会 ...
- 《JAVA设计模式》之装饰模式(Decorator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...
随机推荐
- D3树状图给指定特性的边特别显示颜色
D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...
- linux中service *** start与直接运行/usr/bin/***的区别
在linux想要运行启动一个服务有两种方法: 1,运行/etc/init.d/目录下的shell脚本,还可以有快捷方式,service *** start/ stop/restart /status, ...
- UNION 和 UNION ALL 区别
UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1.UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 ...
- python的with...as用法
with...as叫做上下文管理器,作用是进入一个对象的作用域和离开时,可以执行执行一定的操作.这个操作是可以自己 设定的. 写个例子学习一下: class test(): def __init__( ...
- SVN的感叹号
黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人 ...
- MVC4 +EasyUI 使用TreeGrid 方法
用easyui已经有2年了,换了新环境,要求用mvc开发,所以想把原来的项目直接用mvc重构. 在使用TreeGird的时候出现了问题,发现在转换为treegrid的json 很费劲,一直都是用的ea ...
- bootstrap-提示标签、提示框
提示标签: <body> <div class="container"> <div class="row"> <div ...
- GDB 调试 一些命令
1. gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从 ...
- Java 如何将String转化为Int
在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...
- 廖雪峰JavaScript学习摘录
一. 1.语法基础: (1)特别注意相等运算符==.JavaScript在设计时,有两种比较运算符: 第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果: 第二种是===比较 ...