java装饰模式

在java的IO中就是运用装饰模式设计的。一层装饰一层

如:DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));

装饰模式的组成:1、抽象构件角色:相当java.io中的OutputStream或者是InputStream

2、具体构件角色:相当于java.io中的FileInputStream或者是FileOutputStream

3、抽象装饰角色:持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口(即该角色继承或实现抽象构件角色)相当于java.io中的FilterInputStream或FilterOutputStream。

4、具体装饰角色:负责给构件对象添加附加功能。相当于java.io的BufferedInputStream或BufferedOutputStream。

代码实现如下:

/**
*定义抽象构件角色,并定义一个方法
*/
public interface Component {

    public void doSomething();
}
/**
* 定义具体构件角色,实现方法
*/
public class ConcreteComponent implements Component {

    @Override
    public void doSomething() {
        System.out.println("FileInputStream");
    }

}
/**
 * 定义抽象装饰角色,持有构件对象的引用,并定义一个与抽象构件接口一致的接口(即该角色继承或实现抽象构件角色)
 * @author acer
 *
 */
public class Derector implements Component{

    private Component component;

    public Derector(Component component){
        this.comonent = component;
    }

    @Override
    public void doSomething() {
        component.doSomething();
    }
}
/**
 * 定义具体装饰角色,并添加附加功能
 * @author acer
 *
 */
public class ConcreteDerector1 extends Derector {

    public ConcreteDerector1(Compenent component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        doAnything();
    }

    public void doAnything(){
        System.out.println("DataInputStream");
    }

}
/**
 * 装饰模式,客户端测试
 *
 * @author acer
 *
 */
public class Client {
    public static void main(String[] args) {
        Component component1 = new ConcreteComponent();

        Component component2 = new ConcreteDerector1(component1);//构建DataInputStream

        component2.doSomething();
    }
}

输出结果:

FileInputStream
DataInputStream

时间: 2024-12-16 01:41:47

java装饰模式的相关文章

Java装饰模式(Decorator模式)

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

我所理解的设计模式之Java装饰模式

快要毕业了,之前学习的设计模式没有想到这么重要,马马虎虎就应付过去了,现在重新学习一下. 在这里写一下自己所理解的装饰模式,语言不多,看代码吧-- ? 1 2 3 4 5 6 7 8 9 10 11 12 13 package decorator; /**  * User.java  * 定义一个接口,规定好一个方法,以后所有的类都去实现或重写这个方法  * @author sztsiang  *  */ public interface User {     void show(); } ?

Java 装饰模式 (Decorator)

装饰模式 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的取代方案 代码 package gx.component; /** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 * @author always * */ public abstract class Component { public abstract void description(); public abstract int cost(); } package gx.component.impl;

Java设计模式----装饰模式

1.概念: (在我看来,模式就像是是一种思想,在这种思想的指引下,对代码和结构的一番加工和整合而已!都是套路!) 装饰模式又称包装(Wrapper)模式,是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.对客户端透明意味着接口不变. 2.问题: 在OO设计和开发过程中, 经常会遇到下面的情况: 我们需要为已经设计好的类添加新的职责, 通常情况下我们会定义一个新类继承自定义好的类. 由于组合比继承更好(复杂度高,继承深度深等原因, 类图: 3.如何实现装饰: (1):继承形式:(不推

JAVA设计模式:装饰模式

前面我们学习了代理模式: 代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口. 本次我们学习下装饰模式: 装饰模式又称为包装模式,装饰模式以对客户端透明的方式扩展对象功能,相对于代理而言,代理是不让客户端知道真实对象的信息,装饰模式是基层关系的一个替代方案. 装饰模式是采用对客户端透明的方式动态的给一个对象添加了更多职责,对于原来被装

JAVA设计模式之装饰模式

装饰模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 例子:你要替一家咖啡店设计beverage类.beverage有很多种,并且可以添加许多的调料,比如蒸奶.豆浆.摩卡等. 1 public abstract class Beverage 2 { 3 String description = "Unknown Beverage"; 4 5 public String getDescription() 6 { 7 return description

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

《JAVA与模式》之装饰模式

装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 装饰模式的类图如下: 在装饰模式中的角色有: ● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象. ● 具体构件(ConcreteComponent)角色

《Java设计模式》之装饰模式

装饰模式(Decorator) 1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.    装饰模式以对client透明的方式动态的给一个对象附加上很多其它的责任.换言之client并不会觉的对象在装饰前和装饰后有什么差别. 3.    装饰模式能够在不创造很多其它的子类的模式下,将对象的功能加以扩展. 4.    装饰模式与类继承的差别: 1)    装饰模式是一种动态行为,对已经存