博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中的设计模式一 装饰模式
阅读量:6006 次
发布时间:2019-06-20

本文共 2473 字,大约阅读时间需要 8 分钟。

1.装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

2.装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。

3.装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展

4.装饰模式与类继承的区别:

1)装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。

2)装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。

3)装饰与继承比较图:

4)装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真是的对象。

5.装饰模式把对客户端的调用委派给被装饰的类,装饰模式的关键在于这种扩展完全透明的。

6.装饰模式的构成:

1)抽象构建角色(Component):给出一个抽象的接口,以规范准备接受附加责任的对象。相当于i/o流里面InputStream/OutputStreamReader/Writer

2)具体的构建角色(ConcreteComponent):定义一个将要接受附加责任的类。相当于i/o里面的FileOutputStreamFileInputStream

3)装饰角色(Docorator):持有一个抽象构建(Component)角色的引用,并定义一个与抽象构件一致的接口。相当于i/o里面的FilerOutputStreamFilterInputStream

4)具体的装饰角色(ConcreteDecorator):负责给构建对象“贴上”附加的责任。相当于i/o流里面的BufferedOutputStreamBufferedInputStream以及DataOutputStreamDataInputSrtream

7.装饰模式的特点:

1)装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。

2)装饰对象包含一个真实对象的引用(reference).

3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。

4)装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能。

8.案例:

1)抽象的构建接口:

packagecom.abao.decorate;

 

public interface Component

{

public void doSomething();

}

2)具体的构建角色:

packagecom.abao.decorate;

 

public class ConcreteComponent implements Component

{

@Override

public void doSomething()

{

System.out.println("功能A");

}

}

3)装饰角色:

packagecom.abao.decorate;

 

public class Decorate implements Component

{

private Component component;

 

public Decorate(Component component)

{

this.component = component;

}

 

@Override

public void doSomething()

{

component.doSomething();

}

}

4)具体装饰角色1

packagecom.abao.decorate;

 

public class ConcreteDecorate1 extends Decorate

{

public ConcreteDecorate1(Component component)

{

super(component);

}

 

@Override

public void doSomething()

{

super.doSomething();

 

this.doAnotherDosomething();

}

 

private void doAnotherDosomething()

{

System.out.println("功能B");

}

}

5)具体装饰角色2

packagecom.abao.decorate;

 

public class ConcreteDecorate2 extends Decorate

{

public ConcreteDecorate2(Component component)

{

super(component);

}

 

@Override

public void doSomething()

{

super.doSomething();

 

this.doAnotherDosomething();

 

}

 

private void doAnotherDosomething()

{

System.out.println("功能C");

}

}

6)客户端

packagecom.abao.decorate;

 

public class Client

{

public static void main(String[] args)

{

 

Component component = new ConcreteDecorate1(

new ConcreteDecorate2(new ConcreteComponent()));

component.doSomething();

}

}

9.完!

转载地址:http://pdsmx.baihongyu.com/

你可能感兴趣的文章
Jmeter压测问题_Non HTTP response code: org.apache.http.conn.ConnectTimeoutException
查看>>
开源VOIP语音编解码器Speex
查看>>
spark第六篇:Spark Streaming Programming Guide
查看>>
基于拼音的搜索
查看>>
pythonfile的知识点
查看>>
搭建开发板的测试环境
查看>>
LeetCode 283. Move Zeroes
查看>>
【第二组】项目冲刺(Alpha版本)第二次每日例会 2017/7/12
查看>>
input整理
查看>>
日期计算
查看>>
文本文件,sublime打开中文乱码,或是chrome打开中文乱码
查看>>
重拾单片机
查看>>
route 配置默认网关
查看>>
js正则、js全选、反选、全不选、ajax批删
查看>>
中断系统
查看>>
括号配对问题
查看>>
无主之地1
查看>>
Foundations of Machine Learning: Boosting
查看>>
前端基本功之选择题
查看>>
今天一定要纪念一下
查看>>