java设计模式之装饰模式(在i/o流中的应用)
来源:互联网 发布:java主要用途 编辑:程序博客网 时间:2024/05/02 04:41
装饰模式比较简单,但是比较实用。可以在不用继承的情况下,扩展原有对象的功能。该模式简单明了,需要牢牢记住!
1.
2.
3.
1)
2)
3)
4)
1)装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。
2)装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。
3)装饰与继承比较图:
4)装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真是的对象。
6.装饰模式把对客户端的调用委派给被装饰的类,装饰模式的关键在于这种扩展完全透明的。
7.装饰模式的构成:
1) 抽象构建角色(Component):给出一个抽象的接口,以规范准备接受附加责任的对象。相当于i/o流里面InputStream/OutputStream和Reader/Writer。
2) 具体的构建角色(ConcreteComponent):定义一个将要接受附加责任的类。相当于i/o里面的FileOutputStream和FileInputStream。
3) 装饰角色(Docorator):持有一个抽象构建(Component)角色的引用,并定义一个与抽象构件一致的接口。相当于i/o里面的FilerOutputStream和FilterInputStream。
4) 具体的装饰角色(ConcreteDecorator):负责给构建对象“贴上”附加的责任。相当于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream
8.案例:
1) 抽象的构建接口:
packagecom.abao.decorate;
public interfaceComponent
{
publicvoid doSomething();
}
2) 具体的构建角色:
packagecom.abao.decorate;
public classConcreteComponent implementsComponent
{
@Override
publicvoid doSomething()
{
System.out.println("功能A");
}
}
3) 装饰角色:
packagecom.abao.decorate;
public classDecorate implementsComponent
{
privateComponent component;
publicDecorate(Component component)
{
this.component= component;
}
@Override
publicvoid doSomething()
{
component.doSomething();
}
}
4) 具体装饰角色1:
packagecom.abao.decorate;
public classConcreteDecorate1 extendsDecorate
{
publicConcreteDecorate1(Component component)
{
super(component);
}
@Override
publicvoid doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
privatevoid doAnotherDosomething()
{
System.out.println("功能B");
}
}
5) 具体装饰角色2:
packagecom.abao.decorate;
public classConcreteDecorate2 extendsDecorate
{
publicConcreteDecorate2(Component component)
{
super(component);
}
@Override
publicvoid doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
privatevoid doAnotherDosomething()
{
System.out.println("功能C");
}
}
6) 客户端
packagecom.abao.decorate;
public classClient
{
publicstatic void main(String[] args)
{
Component component = new ConcreteDecorate1(
newConcreteDecorate2(newConcreteComponent()));
component.doSomething();
}
}
装饰者模式
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。
装饰者通常是用其他类似于工厂或生成器这样的模式创建的。
抽象被继承者类:Beverage.java
具体被装饰类:HouseBlend.java, DarkRoast.java, Decat.java, Espresso.java,只给出一个,其他类似
装饰者抽象类:CondimentDecorator.java
具体装饰者类:Mocha.java,Soy.java,Milk.java,Whip.java,只给出一个,其他类似
测试类:Test.java
1)继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。
2)在设计中,应该允许行为可以被扩展,而无须修改现有的代码。
3)组合和委托可用于在运行时动态地加上新的行为。
4)除了继承,装饰者模式也可以让我们扩展行为。
5)装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
6)装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。
7)装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
8)可以用无数个装饰者包装一个组件。
9)装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
10)装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
- java设计模式之装饰模式(在i/o流中的应用)
- 《JAVA与模式》之装饰模式(Decrator)以及装饰模式在Java I/O中的应用
- [转]设计模式在Java I/O中的应用(装饰模式和适配器模式)
- 设计模式之装饰者模式(二)---java中的装饰者I/O结构
- 设计模式学习笔记--设计模式在Java I/O中的应用(装饰模式和适配器模式)
- 装饰模式在Java I/O库中的应用
- 装饰者模式在Java I/O中的应用
- java I/O之装饰设计模式
- Java I/O编程 装饰设计模式及应用
- JDK中的装饰模式:Java I/O
- java I/O之装饰者模式
- Java I/O 技术(四)—— 装饰设计模式及应用 初识
- I/O流--2(字符流,装饰设计模式)
- Java I/O装饰模式
- 设计模式在游戏中的应用--装饰模式(三)
- Java与模式 之 I/O库中的应用
- 装饰模式(I/O流)
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- 03_Servlet编程
- java中的io流
- android中点击空白处隐藏软键盘
- Java学习笔记(十三)
- 设计模式--观察者模式
- java设计模式之装饰模式(在i/o流中的应用)
- Java学习笔记(十四)
- ZOJ 1084 Channel Allocation 四色定理
- MySQL错误代码大全
- Java学习笔记(十五)
- Unity3D 读写 txt 文件
- POJ 2996 Help Me with the Game
- 模板语法<精通篇>
- Java学习笔记(十六)