---------------------- java+android开发、android培训、期待与您交流! ----------------------
装饰类,的特点在于灵活,高效,可以避免复杂的类的继承体系。
装饰类,在疯狂java讲义的5.8.2节出,叫做利用组合实现复用。可以作为参考。
/*
MyReader --专门用于读取数据的类
|--MyTextReader
|--MyBufferedTextReader
|--MyMediaReader
|--MyBufferedMediaReader
|--MyDataReader //后续可能还需要增加的类
|--MyBufferedDataReader
//为了提高读取速度和效率,引入缓冲区,所以按照上面的逻辑,需要引入多个类来完成各自的缓冲,结构复杂,效率低
可以用一般的装饰类
class MyBufferedReader
{
MyBufferedReader( MyTextReader text)
{}
MyBufferedReader( MyMediaReader media)
{}
MyBufferedReader( MyDataReader data)
{}
//这么做还是开销大,体系复杂。扩展性很差
}
上面这个类的扩展性很差
找到其参数的共同类型,通过多态的形式,可以提高扩展性
class MyBufferedReader extends MyReader
{
<span style="white-space:pre"> </span>private MyReader r;
<span style="white-space:pre"> </span>MyBufferedReader(MyReader r)
<span style="white-space:pre"> </span>{}
}
这个时候,结构为:
MyReader --专门用于读取数据的类
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader
<pre code_snippet_id="406366" snippet_file_name="blog_20140626_1_4508160" class="html" name="code">装饰模式比继承要灵活,避免了继承体系臃肿
而且,降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能呢和已有的是相同的,只不过,提供了更强的功能。
所以,装饰类和被装饰类通常是都属于一个体系中
<span style="font-family: Arial, Helvetica, sans-serif;">*/</span>
</pre>
/*
装饰类设计模式:
当想要对已有的对象进行功能增强时
可以定义类。将已有的对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类为装饰类。
装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰对象的功能提供更强的功能。
*/
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;
SuperPerson(Person p )
{
this.p = p;
}
public void SuperChiFan()
{
System.out.println("开胃酒");
p.chifan();
System.out.println("吃饭");
System.out.println("喝汤");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p= new Person();
SuperPerson sp = new SuperPerson(p);
sp.SuperChiFan();
}
}
---------------------- java+android开发、android培训、期待与您交流! ----------------------详细请查看:www.itheima.com