学习这个模式比前几个要难点了,搞了半天才弄懂。好吧,也许是我脑子慢
装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
《《大话设计模式》》一书中以“小菜”去约会需要打扮为例子来展开学习装饰模式的,对于该模式,本人的理解是:就是对一个已有的算法进行二次加工,但又不改变原来的代码,在原有的数据处理中再一次进行处理。
好了不多说,通过代码去理解会更好一点,本人代码中的注解很关键,都是我在编写的过程中理解总结出来的,对理解装饰模式很关键。
1、人要打扮,要穿衣服,所以第一个对象是人
/*
* 装饰模式
* 要装饰的对象
*/
publicclass Person {
private Stringname;
public Person(){ }
public Person (String name){
this.name = name;
}
public void show(){
System.out.println("装饰的"+name);
}
}
2、装饰类,我要用衣服来装饰自己,所有要定义一个装饰类来作为具体装饰物的父类
/*
* 装饰的衣服大类
*/
public class Fineryextends Person {
private Personperson;
//打扮谁
publicvoid decorator(Person person){
this.person = person;
}
@Override
publicvoid show() {
//TODO Auto-generated method stub
if(person !=null){
person.show();//实际执行的是person中的方法。为什么还要增加类Finery呢?因为人装饰的是衣服,而衣服有很多种(子类)
}
}
public Person getPerson() {
returnperson;
}
publicvoid setPerson(Person person) {
this.person = person;
}
}
3、T恤类,装饰物为T恤
/*
* 具体的类,t恤,要装饰到人身上
*/
publicclass TShirtsextendsFinery {
publicvoidshow(){
System.out.println("穿上T恤!");//在实际开发中,此应该为对人数据进行处理的过程。
super.show();//父类处理的过程
}
}
4、裤子类
/*
* 具体的类,裤子,要装饰到人身上
*/
publicclass BigTrouserextends Finery {
publicvoidshow(){
System.out.println("穿上裤子!");
super.show();
}
}
5、客户端调用类
publicclass DecoratorClient {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub
Personperson = new Person("我");
TShirtstShirts = new TShirts();
BigTrousertrouser = new BigTrouser();
//装饰过程
tShirts.decorator(person);
trouser.decorator(tShirts);
trouser.show();
}
}
打印结果为:
穿上裤子!
穿上T恤!
装饰的我
分析打印结果:
当程序执行到trouser.show()时,打印:穿上裤子!,这个没有问题,这个方法中还有一个方法是super.show(),此事super(父类)为TShirts对象,为什么呢?请看trouser.decorator(tShirts);这个就是将裤子的父类变成T恤了,所以super.show()方法其实执行的是T恤类中的System.out.println("穿上T恤!"); super.show();这两步,打印“穿上T恤”后,执行super.show(),此事super是谁呢?根据tShirts.decorator(person);可以看出就是Person本人了。这样会执行Person类中的show方法:System.out.println("装饰的"+name);即打印出装饰的我。好了介绍完了,这个对于我来说很难理解到。有问题留言哟,谢谢!
附上装饰模式的结构图
总结:装饰模式是为已有功能动态的添加更多功能的一种方式。当系统需要更新功能的时候,是向旧的类中添加新的代码,这些新的代码通常装饰了原有类的核心职责或主要行为,比如穿T恤、裤子装饰自己,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。
附上源代码地址:http://download.csdn.net/detail/jzhf2012/8086335