黑马程序员_<<装饰设计模式>>
--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
装饰设计模式是对已有类的对象进行封装,然后使其具有更强大的功能,当定义好的类功能不够完善的时候,我们不希望是修改源代码,那么我们就可以定义好一个类,把其对象封装到里面,然后对其功能进行扩展。
一般设计的模式:
当你想要对已有的独享尽心功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供增强功能,那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
2. 应用实例
当我们操作IO流的时候,在读取或者是写入的时候,使用的是FileWriter和FileReader,由于效率不高,我们采用了缓冲技术,BufferedWriter和BufferedReader,这样我们就提高了效率,实际上这里就是使用了缓冲技术,装饰设计模式,把Writer和Reader封装到缓冲类中,对其功能增强了,增强了跨平台的newLine方法和读 更方便的readLine方法。都是基于现有类的方法进行扩展的。
下面我们就模拟一下这个实例:
public class Person {//普通类 public void eat(){ System.out.println("吃饭"); }}/** * 装饰类 *进行封装了Person类对象,进行功能的扩展 */public class superPerson { private Person person; public superPerson(Person person){ this.person=person; } public void superEat(){ System.out.println("喝点小酒"); person.eat(); System.out.println("看会电视"); System.out.println("打太极"); } }/** * 测试类 */public class Text { public static void main(String[] args){ Person p=new Person();//普通类对象 superPerson pp=new superPerson(p);//装饰类对象 pp.superEat(); } }结果:喝点小酒吃饭看会电视打太极
4. 装饰类和继承类
假如我们对已有的类进行扩展的方式使用继承的话,那么已有类(A)没增加一个子类(a extends A),我们都要对其子类进行再次继承(aa extends a),那么这样继承体系就太复杂,太臃肿了。
那么我们可以把现有类进行封装到一个类中,然后利用基类对象进行优化,
public class buffered{
private Aes;
publicbuffered(A es){
this.es=es;
}
下面根据es对象的方法,然后对其功能进行扩展,可以重写,也可以继续已有方法,写其他功能更完善的方法。
}
这样的体系就更简单易懂,这个就是装饰类。也是我们的装饰设计模式思想。
这也是从封装到装饰的过程。
装饰模式和继承的联系去区别:
装饰模式是对继承之间的关系的优化,这样就比继承更灵活,避免了继承体系臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以装饰类和被装饰类通常都属于一个体系中。
--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------