装饰设计模式
Posted 北方丶有佳人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰设计模式相关的知识,希望对你有一定的参考价值。
Writer
|--TextWriter
|--MediaWriter
在对数据写入操作过程中,希望提升效率
要对操作文本的对象提升效率,使用缓冲区技术。
Writer
|--TextWriter
|--BufferedTextWriter
|--MediaWriter
|--BufferedMediaWriter
这样的体系,为了增加一些功能,而通过产生子类来完成,会导致继承体系变得很臃肿
重新思考体系的设计问题,都是在写的方法进行效率提升。
为什么不 将该功能进行单独的封装?要提升哪个具体的对象,将哪个具体的对象交给该功能不就可以了吗?
class BufferedWriter extends Writer
{
BufferedWriter(Writer w){}//高效
/*
BufferedWriter(TextWriter t){}
BufferedWriter(MediaWriter m){}
*/
}
Writer
|--TextWriter
|--MediaWriter
|--AudioWriter
|--BufferedWriter
TextWriter tw = new TextWriter();
BufferedWriter bw = new BufferedWriter(tw);
bw.write();
解决:可以给对象提供额外的功能(职责),比继承更为灵活。
起个名字:装饰设计模式(wrapper,decorator)
装饰类与被装饰类都所属于同一个体系。
同时装饰类中会持有被装饰类的引用,Java中的BufferedReader就是采用的装饰设计模式。
public class PersonDemo { public static void main(String[] args) { Man p = new Man(); NewPerson pp = new NewPerson(p);//使用装饰类装饰一下 pp.chiFan(); } } class Person{ void chiFan(){ System.out.println("吃饭"); } } class Man extends Person{ void chiFan(){ System.out.println("男人吃饭"); } } class SubMan extends Man{//继承会使体系显得臃肿 void chiFan(){ System.out.println("开胃酒"); super.chiFan(); System.out.println("甜点"); System.out.println("来一根"); } } class NewPerson extends Person{//装饰类 private Person p; NewPerson(Person p){ this.p = p; } void chiFan(){ System.out.println("开胃酒"); p.chiFan(); System.out.println("甜点"); System.out.println("来一根"); } }
以上是关于装饰设计模式的主要内容,如果未能解决你的问题,请参考以下文章