Java设计模式—装饰模式
装饰模式是一种比较常见的模式。
定义为:动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
装饰模式的通用类图如下:
装饰模式的构成:
1) 抽象构件(Component):是一个接口或者是抽象类,就是定义我们最核心的对象,也就是原始的对象。
******在装饰模式中必须有一个最基本,最核心,最原始的接口或者抽象类来充当Component抽象构件******
2) 具体构件(ConcreteComponent):是最核心,最原始,最基本的接口或者抽象类的实现,你要装饰的就是它
3) 装饰角色(Docorator):一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象方法呀,在它的属性里必然有一个private变量指向Component抽象构件。
4) 具体装饰角色(ConcreteDecoratorA和B):是两个具体的装饰类,你要把你最核心,最原始,最基本的东西装饰成其他东西。
装饰模式与类继承的区别:
1) 装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。
2) 装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。
3) 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真是的对象。
装饰模式的特点:
1) 装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。
2) 装饰对象包含一个真实对象的引用(reference).
3) 装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
4) 装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能。
来分析一个例子:
package zhuangshimoshi;
/*
* 装饰模式
*/
public class Test { public static void main(String[] args) {
//要修饰的对象com
Component com=new ConcreteComponent(); //进行第一次修饰
com=new ConcreteDecorator1(com); //进行第2次修饰
com=new ConcreteDecorator2(com); com.operate(); //com=new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent())); } } //抽象构件
abstract class Component{
//抽象方法
public abstract void operate();
} //具体构件
class ConcreteComponent extends Component{ //具体实现
public void operate() {
System.out.println("这里是具体构件,实现了抽象构件中的方法");
} } //抽象装饰者,一般为一个抽象类
abstract class Decorator extends Component{
//必须有一个private变量指向Component抽象构件
private Component component;
//通过构造函数传递被修饰者
public Decorator(Component component)
{
System.out.println("这里是抽象类Decortor...");
this.component=component;
} //委托给被修饰者执行
public void operate()
{
System.out.println("父类的操作方法...");
this.component.operate();
}
} //具体的装饰类
class ConcreteDecorator1 extends Decorator{ //定义被装饰者
public ConcreteDecorator1(Component component) {
super(component); }
//定义自己的修饰方法
private void method1()
{
System.out.println("method1修饰。。。");
} //重写父类的operate方法
public void operate()
{
this.method1();
super.operate();
} } class ConcreteDecorator2 extends Decorator{ //定义被装饰者
public ConcreteDecorator2(Component component) {
super(component); }
//定义自己的修饰方法
private void method2()
{
System.out.println("method2修饰。。。");
} //重写父类的operate方法
public void operate()
{
super.operate();
this.method2();
} }
输入结果如图所示:
分析1:主函数中执行了com=new ConcreteDecorator1(com);这个语句,将调用ConcreteDecorator1的构造函数,接着调用父类的构造函数,所以输出了一句“这里是抽象类Decortor...”。
分析2:同理执行了com=new ConcreteDecorator2(com);也输出了“这里是抽象类Decortor...”。
分析3:执行了com.operate(),首先是ConcreteDecorator2类的operate()方法被执行,即super.operate();,此时要执行其父类的operate()。父类Decorator的operate()方法被执行,输出了“父类的操作方法...”。
分析4:接着执行this.component.operate();语句。注意了!!!!此时component对象指的是ConcreteDecorator1类的对象,即将要执行的ConcreteDecorator1类中的operate()方法,所以输出了"method1修饰。。。"
分析5:接着执行super.operate();语句,又回到父类Decorator中的operate()方法,输出了“父类的操作方法...”。
分析6:接着执行this.component.operate();语句。注意了!!!!此时component对象指的是ConcreteComponent类的对象,所以执行ConcreteComponent类的operate()方法。所以输出了"这里是具体构件,实现了抽象构件中的方法"。
分析7:最后执行this.method2();语句,输出"method2修饰。。。"
以上是本例的详细解释,得多看几遍细细领悟才行。
Java设计模式—装饰模式的更多相关文章
- Java设计模式---装饰模式
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...
- Java设计模式-装饰模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...
- Java设计模式——装饰模式
转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
随机推荐
- vue.js2.0实战(1):搭建开发环境及构建项目
Vue.js学习系列: vue.js2.0实战(1):搭建开发环境及构建项目 https://my.oschina.net/brillantzhao/blog/1541638 vue.js2.0实战( ...
- NIO和Reactor
本文参考Doug Lea的Scalable IO in Java. 网络服务 随着网络服务的越来越多,我们对网络服务的性能有了更高的要求,提供一个高性能,稳定的web服务是一件很麻烦的事情,所以有了n ...
- HDU 3915 Game (高斯消元)
题意:有n堆石子,每个人只能从某一堆至少拿走一个,不能拿者败.问事先拿走某些堆的石子,使得先手必败. 析:将石子拆成二进制,未知数为1表示保留该堆石子,为0表示事先拿走该堆石子.最后求自由变元的数目, ...
- ASP.NET jquery 获取服务器控件ID
一般方法: jQuery("#txtUserName").val(); 如果页面加载了母版页或者自定义控件:该页面的ID有可能会被篡改(可能是因为避免控件ID冲突的机制),因此强烈 ...
- MVC下使用ajax后台查询值赋值到前端控件
初学MVC,今天做个简单的功能,就是输入BeginDate和EndDate,从后台计算后赋值给另外一个文本框Amount 界面很简单,方法也很简单,今天就使用jquery的post方法,先准备后台代码 ...
- mssql 递归
--递归id往下所有内容with temp ( URE_ID, URE_PARENT_ID,URE_NAME ,URE_TYPE)as(select URE_ID, URE_PARENT_ID,URE ...
- sqlserver2012——存储过程
存储过程:是一组为了完成特定功能的SQL语句,经编译后存储在数据库中. 他们可以接受参数.输出参数.返回单个或者多个结果集以及返回值 存储过程种类 1.用户自定义存储过程 2.系统存储过程 3.扩展存 ...
- vs2013提交项目到github
提交项目之前必须先安装Git,下载地址:https://git-scm.com/download/win 1.登录Github后,在顶部导航栏选择New repository: 2.打开Create ...
- PS2018学习笔记(19-24节)
19-随心所欲变换 # 本节知识点 自由变换 移动变换 旋转变换 斜切变换 变形变换 扭曲变换 透视变换 # 本节段落表 自由变换命令 变换中的移动 再次变换命令 对象缩放 旋转 斜切 变形 扭曲 透 ...
- tomcat mamcached session共享方法
下载后输入命令安装命令: c:\memcached\memcached.exe -d install 然后再输入如下命令把其作为win service常驻启动: c:\memcached\memcac ...