- 浏览: 308440 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (187)
- JAVA (66)
- JS (2)
- AJAX (9)
- Servlet (5)
- eclipse (4)
- html (2)
- PL/SQL (9)
- SOAP (1)
- other (14)
- JavaScript (8)
- Struts2 (6)
- Spring (10)
- Hibernate (5)
- JSP (1)
- Linux (3)
- WebService (2)
- 数据结构 (1)
- DB (5)
- English (1)
- maven (4)
- Code standard (2)
- SQL (1)
- 软件架构 (1)
- Tomcat (2)
- windows (1)
- HSQL (0)
- Open source framework (0)
- Web (6)
- Compass (0)
- Flex (1)
- OSGI (1)
- python (3)
- groovy (2)
- JPA (2)
- svn (1)
- jetty (1)
最新评论
-
zjfshowtime:
it doesn't work !why
Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池 -
coco5012:
Useful
sql server日期时间函数 datetime -
烟花弥散:
弱弱的问一句,您的第一个举例中else 后面可以跟判断条件吗? ...
Java高手论道:你还在用if else吗? -
coco5012:
Not very simple
使用assembly plugin实现自定义打包 -
mqlfly2008:
[color=red][size=medium][size=x ...
Java高手论道:你还在用if else吗?
装饰器模式 主要应用于这样一种场合,当你已经有了一个目标类,并且它是一个接口的实现类,在对该类使用的后期发现需要对相应接口程序的前后做更多的处理,这些处理是变化的,不固定的,但是有不能去修改这个目标类,这时我们就可以使用这个装饰器模式:
比如,我们已经有一个付款的方法 payMoney(long count) ,这个方法只负责将钱付给对方,不做其他操作,但是这时我们需要记录下这个付款的操作,并把这个操作记录到日志文件中以方便日后的查看,比如这个方法叫做 insertLog(String str) ,有一种办法就是使用继承,并复写相应的 payMoney(long count) 方法,这样也可以满足条件,但是问题出来了,如果我们又有其他的操作,例如通知付款人已经将款额付出 notic(String username) ,这时候这么办,当然我们仍然可以通过继承来实现,可是如果我现在有不想将付款操作记录到日志文件中了,那我又该这么办?
为了解决这种问题,我们使用了 装饰器模式 ,在我们的应用中可以使用不同的装饰器类(以及装饰器类的组合)来达到以上的目的。
再将问题简化,我们要在控制台输出字符,但是需要在字符前后加上“*”和“+”,也就是说,我可能需要在我输入的字符前后加上“*”,也可能过了会儿又想加“+”而不是“*”,或者又想“*”和“+”都加上,有或者都不想加。
装饰器模式 让这些要求动态的配置出来,也就是说在运行时不需要改变原来已经生成好的对象。
让我们来看看这个解决方案的 装饰器模式 的类图吧:
其中,MyText 类为我们要显示的字符类,而 DecoratorTextConsole 及其子类为我们的 装饰类 。
具体代码如下:
/**********************************************************************/
package decorator.interfaces;
public interface TextConsole {
public void printWords();
public void readWords();
}
/**********************************************************************/
package decorator.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import decorator.interfaces.TextConsole;
public class MyText implements TextConsole {
private String words;
public void printWords() {
System.out.print(words);
}
public void readWords() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.print("please enter some word to display:");
words = br.readLine();
}catch(IOException e){
e.printStackTrace();
words = "There are some errors occured during your entering!";
}
}
}
/**********************************************************************/
package decorator.interfaces.impl;
import decorator.interfaces.TextConsole;
public class DecoratorTextConsole implements TextConsole {
private TextConsole text;
public DecoratorTextConsole(TextConsole text){
this.text = text;
}
public void printWords() {
text.printWords();
}
public void readWords() {
text.readWords();
}
}
/**********************************************************************/
package decorator.interfaces.impl;
import decorator.interfaces.TextConsole;
public class AsteriskTextConsole extends DecoratorTextConsole {
public AsteriskTextConsole(TextConsole text){
super(text);
}
public void printWords(){
addAsterisk();
super.printWords();
addAsterisk();
}
private void addAsterisk(){
System.out.print("*");
}
}
/**********************************************************************/
package decorator.interfaces.impl;
import decorator.interfaces.TextConsole;
public class PlusTextConsole extends DecoratorTextConsole {
public PlusTextConsole(TextConsole text){
super(text);
}
public void printWords(){
addPlus();
super.printWords();
addPlus();
}
private void addPlus(){
System.out.print("+");
}
}
/**********************************************************************/
package decorator;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import decorator.interfaces.TextConsole;
import decorator.interfaces.impl.AsteriskTextConsole;
import decorator.interfaces.impl.PlusTextConsole;
import decorator.service.MyText;
public class TestMain {
public static void main(String[] args){
TextConsole mt = new MyText(); // mt 实例在整个被调用的过程中都不会改变,但是它的其他装饰器类却是动态生成的,而且是可自由“拆卸”的,这样就比单一的继承灵活的多。
mt.readWords();
mt.printWords();
System.out.println();
String commond = new String();
System.out.println("please enter commond: (add ?(-plus | -astr | -all) | exit");
while(!commond.equals("exit")){
try{
commond = new BufferedReader(new InputStreamReader(System.in)).readLine();
}catch(IOException e){
e.printStackTrace();
commond = "exit";
}
if(commond.equals("add -plus")){
TextConsole ptc = new PlusTextConsole(mt);
ptc.printWords();
System.out.println();
}else if(commond.equals("add -astr")){
TextConsole atc = new AsteriskTextConsole(mt);
atc.printWords();
System.out.println();
}else if(commond.equals("add -all")){
TextConsole tc = new AsteriskTextConsole(new PlusTextConsole(mt));
tc.printWords();
System.out.println();
}else{
mt.printWords();
System.out.println();
}
}
}
}
/**********************************************************************/
发表评论
-
JAVA ArrayList深层 拷贝 克隆
2012-04-23 14:13 2557大家应该理解浅拷贝和深拷贝的区别: 浅拷贝:被复制对象的任何 ... -
深入 Lucene 索引机制
2011-09-21 21:49 616简介: Lucene 是一个 ... -
Apache DBUtils使用总结
2011-09-19 10:50 980Apache DBUtils使用总结 DBU ... -
Java搜索引擎 Lucene
2011-09-19 10:43 882Lucene 是一套用于全文 ... -
Java的弱引用(Weak Reference)
2011-09-16 08:47 1325之前一直没有接触 ... -
JAVA读取大文件
2011-09-13 10:27 3398/** * */ package com.b2s. ... -
Java性能优化技巧
2011-09-06 11:59 890摘要: ==================== ... -
java程序性能优化
2011-09-06 11:58 695一、避免在循环条件中使用复杂表达式 在不做编译优化 ... -
大家在普遍认识中对架构师这一职业有哪些误区
2011-09-04 10:26 745误区一 架构师与项目经理没有区别。大家经常在 ... -
Ibatis执行SQL操作把SQL打印到控制台
2011-08-10 10:46 2772要想让Ibatis打印SQL语句到控制台,可以在log4j.x ... -
用 PMD 铲除 bug
2011-06-08 17:33 1031简介: PMD 是一个开源的静态分析工具,是一个值得您添加 ... -
Web Service 实现分布式服务的基本原理
2011-05-24 13:27 1496简单的说, 就是客户端 ... -
Web Service概述
2011-05-24 10:16 1007Web Service是构建互联网 ... -
有关母亲的名人名言
2011-05-09 08:42 810God could not be everywhere and ... -
Java 7已经完成的七大新功能预览
2011-05-06 12:26 1144今年的Devoxx大会又是一次有关Java 7进程的一 ... -
回归测试
2011-05-04 17:16 795回归测试, 英文是Regression testing。 ... -
jxl 使用总结收藏
2011-04-29 17:33 964jxl的一些总结 要 ... -
Struts1下如何实现国际化
2011-04-25 14:18 1139Struts1下如何实现国际化 1.ApplicationR ... -
JAVA静态导入(import static)详解
2011-04-20 17:52 4024在Java 5中,import语句得到了增强,以便提供甚至更加 ... -
java类型后添加三点的用法
2011-04-20 17:46 1142今天看到一个没见过的函数参数列表test(int... a), ...
相关推荐
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...
在《Element of Reusable Object-Oriented Software》中,GOF 对装饰器模式的用意进行了概述:Decorator Pattern――Attaches additional responsibilities to an object dynamically. Decorators provide a ...
4. **具体装饰器(Concrete Decorator)**:实现了装饰器接口,为组件增加新的行为或属性。每个具体装饰器都对应一种特定的扩展功能。 装饰模式的优点在于其灵活性,它可以独立于原始对象进行扩展,不需要修改原有...
具体装饰器(Concrete Decorator):扩展装饰器的功能,提供额外的行为 总结 装饰模式通过在运行时动态地为对象添加功能,增强了系统的灵活性和可扩展性。它允许在不修改现有代码的情况下添加新的行为,非常适合于...
4. 具体装饰(Concrete Decorator):装饰器的实现,添加了具体组件的特定增强功能。每个具体装饰类可以添加不同的行为,从而提供多种装饰方式。 举个例子,假设我们有一个`Coffee`类,表示基础的咖啡。`Coffee`...
demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择
4. **具体装饰器(Concrete Decorator)**:实现了装饰器的抽象方法,提供了具体的增强功能。每个具体装饰器都为原始组件增加特定的职责。 装饰模式的工作流程如下: 1. 客户端首先创建一个原始组件对象。 2. 然后...
3、定义一个抽象的装饰器类Decorator,它实现了IComponent接口,并持有一个IComponent的引用。 4、创建具体的装饰器类了。例如,一个ConcreteDecoratorA类,它添加了额外的行为。 5、创建另一个装饰器...
4. 具体装饰器(Concrete Decorator):实现了装饰器的抽象方法,并添加新的行为或职责。 在"C#面向对象设计模式纵横谈(10):(结构型模式) Decorator 装饰模式.pdf"中,你可能会学习到如何定义这些角色以及它们之间...
装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...
4. 具体装饰器(Concrete Decorator):实现抽象装饰器接口,负责给组件对象添加新的行为或职责。 在给出的`factory.h`文件中,可能包含一个工厂类,用于创建和组装装饰者模式中的组件和装饰器。工厂方法可以动态地...
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...
装饰器模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的行为或属性。在WPF中,Decorator类通常用于改变控件的外观,如添加边框、背景等。以标题中提到的"自定义边框"为例,我们可以创建一个...
`Decorator`是装饰器,持有`DecoratorComponent`的引用,并实现了相同的操作方法。`AdditionalFeatureA`和`AdditionalFeatureB`是具体装饰器,分别添加了功能A和功能B。 通过以下代码,我们可以创建一个装饰器链并...
JavaScript装饰器(Decorator)是一种元编程机制,它允许在运行时修改或增强对象的功能,而无需更改其源代码。在JavaScript中,装饰器是函数,它们可以被附加到类声明、方法、访问器、属性或参数上。装饰器提供了一种...
装饰器模式通常由四个主要组件构成:组件(Component)、具体组件(Concrete Component)、装饰器(Decorator)和具体装饰器(Concrete Decorator)。让我们逐一解析这些角色: 1. **组件(Component)**:这是接口...