装饰器设计模式初探(Java实现)

  本篇随笔主要介绍用Java实现简单的装饰器设计模式:

    先来看一下装饰器设计模式的类图:

    

     从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰。

    下面是用Java实现的简单的装饰器设计模式,提供的是从基本的加入咖啡入手,可以继续加入牛奶,巧克力,糖的装饰器系统。

    

 1 interface Component {
 2     void method();
 3 }
 4 class Coffee implements Component {
 5
 6     @Override
 7     public void method() {
 8         // TODO Auto-generated method stub
 9         System.out.println("倒入咖啡");
10     }
11
12 }
13 class Decorator implements Component {
14     public Component comp;
15     public Decorator(Component comp) {
16         this.comp = comp;
17     }
18     @Override
19     public void method() {
20         // TODO Auto-generated method stub
21         comp.method();
22     }
23
24 }
25 class ConcreteDecorateA extends Decorator {
26     public Component comp;
27     public ConcreteDecorateA(Component comp) {
28         super(comp);
29         this.comp = comp;
30     }
31     public void method1() {
32         System.out.println("倒入牛奶");
33     }
34     public void method2() {
35         System.out.println("加入糖 ");
36     }
37     public void method() {
38         super.method();
39         method1();
40         method2();
41     }
42 }
43 class ConcreteDecorateB extends Decorator {
44     public Component comp;
45     public ConcreteDecorateB(Component comp) {
46         super(comp);
47         this.comp = comp;
48     }
49     public void method1() {
50         System.out.println("加入巧克力");
51     }
52     public void method() {
53         super.method();
54         method1();
55     }
56 }
57 public class TestDecoratePattern {
58     public static void main(String[] args) {
59         Component comp = new Coffee();
60         comp.method();
61         System.out.println("--------------------------------------------------");
62         Component comp1 = new ConcreteDecorateA(comp);
63         comp1.method();
64         System.out.println("--------------------------------------------------");
65         Component comp2 = new ConcreteDecorateB(comp1);
66         comp2.method();
67         System.out.println("--------------------------------------------------");
68         Component comp3 = new ConcreteDecorateB(new ConcreteDecorateA(new Coffee()));
69         comp3.method();
70         System.out.println("--------------------------------------------------");
71         Component comp4 = new ConcreteDecorateA(new ConcreteDecorateB(new Coffee()));
72         comp4.method();
73     }
74 }

    

    运行结果:

    

    装饰器设计模式可以使得我们自由的,以任意顺序导入巧克力,牛奶,咖啡和糖。可以实现多层,任意顺序的装饰。真是牛~

时间: 2024-12-14 18:51:22

装饰器设计模式初探(Java实现)的相关文章

【ThinkingInJava】42、装饰器设计模式

/** * 书本:<Thinking In Java> * 功能:装饰器设计模式 * 装饰器模式使用分层对象来动态透明的向单个对象添加责任.装饰器指定包装在最初的对象周围的所有对象都具有相同的基本接口 * 某些事物是可装饰的,可以通过将其他类包装在这个可装饰对象的四周,来将功能分层. * 装饰器是通过使用组合和形式化结构(可装饰物/装饰器层次结构)来实现的,而混型是基于继承的 * 文件:Decoration.java * 时间:2015年4月21日10:18:43 * 作者:cutter_po

装饰器设计模式

通俗的讲装饰器就是在不改变对象结构的前提下,扩充对象的功能. 下面以effective java中例题 问题  我想扩充Hash<set>功能,使得能够统计添加过元素的个数? 或许你可能会自定义一个类通过继承扩展,从而实现计数功能,代码如下: package com.effectJava.Chapter2; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; public class I

java 实现装饰器设计模式

package com.gylhaut.base; /** * 装饰器 * 类与类之间的关系 * 1.依赖:形参(局部变量) * 2.关联:属性 * 聚合 属性 整体和部分 不一致的生命周期 人和手 * 组合 属性 整体和部分 一致的生命周期 人和大脑 * 3.继承:父子类关系 * 4.实现:接口与实现的关系 */ public class Decorator { private Voice voice; public void say(){ System.out.println("val=&q

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

设计模式之---装饰器设计模式

职责:动态的为一个对象增加新的功能 装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀. 实现细节: ——Component抽象构件角色:真实对象和装饰对象有相同的接口.这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互. ——ConcreteComponent具体构件角色(真实对象):io流中的FileInputStream. FileOutputStream ——Decorator装饰角色

Python装饰器实现类Java注解功能

最近想用Python写一个简单生成器,类似指定类型和范围,返回指定列表: 比如想要  0 ~ 3 的整数,则 我只需要指定: 最小:0, 最大:3, 步长:1 则返回一个 [0,1,2,3] 的列表 思路是用Python 装饰器,在def方法上打装饰器,装饰器内部替换方法调用时传入的参数值 代码如下: 1 # coding=utf-8 2 3 def integer(min=0, max=100, step=1): 4 def deco(func): 5 def wrapper(val): 6

python 装饰器 @用法初探

今天初步学习了一下python 的生成器,之前一直不明白怎么用,今天基本上搞明白了最基本的. #!/usr/bin/python def a(fn): print 'a' #    def d(st): #        print st+'d' return fn return d def b(fn): print 'b' return fn def e(fn): print 'e' def f(bn): print bn+'e2' return f @e @a @b def c(st): p

java设计模式----装饰器模式

Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. 它可以给被装饰对象添加额外的功能. 用一句话总结就是:保持接口,增强性能. 装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种.它与对象的适配器模式的异同点如下. 相同点:都拥有一个目标对象. 不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 门面(Facade)模式(译者注:facade有些书籍译为门面,有些书籍译为外观,此处译为门面) 门面模式针对复杂的子系统提供了单一的接口,不需要暴漏一些列的类和API给用户,你仅仅暴漏一个简单统一的API. 下面的图解释了这个概念: 这个API的使用者