java 装饰者模式

IPerson:

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:43:04
 */
public interface IPerson {
    public void canDo();
}

Person:

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:44:04
 */
public class Person implements IPerson{

    @Override
    public void canDo() {
        System.out.println("I can code");
    }
}

Decorator(所有Person装饰者的父类):

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:44:55
 */
public class Decorator implements IPerson{
    private IPerson person;
    public Decorator(IPerson person) {
        this.person = person;
    }

    @Override
    public void canDo() {
        person.canDo();
    }
}

DecoratorSwim(Swim装饰--为Peron添加“Swim”功能):

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:48:54
 */
public class DecoratorSwim extends Decorator{

    public DecoratorSwim(IPerson person) {
        super(person);
    }

    @Override
    public void canDo() {
        super.canDo();
        System.out.println("I also can swim");
    }
}

DecoratorDraw(Draw装饰--为Peron添加“Draw”功能):

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:47:29
 */
public class DecoratorDraw extends Decorator{

    public DecoratorDraw(IPerson person) {
        super(person);
    }
    @Override
    public void canDo() {
        super.canDo();
        System.out.println("I also can draw");
    }
}

Test:

/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午3:49:35
 */
public class Test {
    public static void main(String[] args) {
        Decorator decorator = new DecoratorDraw(new DecoratorSwim(new Person()));
        decorator.canDo();
    }
}
时间: 2024-08-01 16:39:00

java 装饰者模式的相关文章

java装饰着模式问题,新手求助

问题描述 java装饰着模式问题,新手求助 本人新手,在java head first设计模式中装饰模式遇到个问题请教大家,问题就是设置饮料杯子的大小,根据杯子大小加上各自的价钱,写的代码如下,不知道为什么结果却不会根据设置的大小加上价钱?感觉应该SizeDecorator中的cost()方法有问题,但是又试不出来,求指点,谢谢 public abstract class Beverage { String description="Unknown Beverage"; String

JAVA装饰者模式(从现实生活角度理解代码原理)_java

装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. (2)处理那些可以撤消的职责. (3)当不能采用生成子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类. 实现该模式的关键步骤: (1)Component(被装饰对象基类

轻松掌握java装饰者模式_java

定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点:     (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互.     (2) 装饰对象包含一个真实对象的引用(reference)     (3) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象.     (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象

Java 装饰器模式详解

转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了java 中常见的 IO 相关知识,在学习的过程中,发现 IO 包中是用了大量的装饰器模式,为了彻底的学习 IO,今天就来揭开装饰器模式的面纱. 为了弄明白装饰器模式的本质,我查看了很多资料,发现有很多文章要么说的很苦涩,要么举的例子不恰当. 其实我们可以这样理解装饰器模式, 就拿自己举例子,你把自己裸体的样子,想象成被装饰的对象

java设计模式系列之装饰者模式_java

何为装饰者模式 (Decorator)? 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活.一.结构 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component { public void operation(); } ConcreteComponent : 实现 Component 定义的接口. class ConcreteComponent implements Component { @O

Java装饰器设计模式初探_java

本篇随笔主要介绍用Java实现简单的装饰器设计模式: 先来看一下装饰器设计模式的类图: 从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰. 下面是用Java实现的简单的装饰器设计模式,提供的是从基本的加入咖啡入手,可以继续加入牛奶,巧克力,糖的装饰器系统. interface Component { void method(); } class Coffee implements Component { @Override

java-JAVA和C#执行HeadFirst装饰者模式的结果差异,求解?

问题描述 JAVA和C#执行HeadFirst装饰者模式的结果差异,求解? JAVA版 //Beverage.java public abstract class Beverage { String description = "Unkown Beverage"; public String GetDescription(){ return description; } public abstract double Cost(); } //CondimentDecorator.java

装饰者模式(Decorator Pattern) Java的IO类的使用方法

Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decorator)的基类. 实现其他装饰者(decorator), 需要继承FilterInputStream类. 代码: /** * @time 2014年5月23日 */ package decorator.io; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream;

java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在写入一个字符时,Java虚拟机会将字符转为文件指定的编码(默认 是系统默认编码),在读取字符时,再将文件指定的编码转化为字符. 常见的码表如下: ASCII:           美国标准信息交换码.用一个字节的7位可以表示. ISO8859-1:   拉丁码表.欧洲码表,用一个字节的8位表示.又称