黑马程序员:装饰类的作用——增强被装饰类的方法的功能(利用组合实现复用)
---------------------- 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
不积跬步,无以至千里。