装饰模式,从装饰两个字可以联想到我们身上的首饰啊衣服什么的。因此本文就以穿衣服为例子说说装饰模式。
该例子的难点是用程序把所需要的衣服按照正确的顺序串联起来控制。
先简单说说装饰模式:装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
按照笔者的理解,装饰模式就是将多个继承了同一个父类的对象嵌套起来。然后调用的时候按照嵌套的顺序一个个地调用这些对象的方法。~
好吧也许看完这句话还不是很了解,没关系直接上代码~~看完代码说不定就懂了呢~~
既然本例是以穿衣服为例,那么就需要一个人。我们先写一个人(Person)类,然后有一个展示衣服的方法show(),人一般都有个名字,给他个name变量,于是人这个类就如下所示:
public class Person {
private String name;
public Person(){}
public Person(String name){
this.name=name;
}
public void show(){
System.out.println(name+"穿衣服");
}
}
然后需要一个衣服类:
public class Finery extends Person {
protected Person component;
public void Decorate(Person p){
component=p;
}
@Override
public void show() {
if(component!=null){
component.show();
}
}
}
可以看到有一个Decorate的方法,这个方法就是在设置一层一层嵌套的时候使用的。
接下来写几个具体衣服的类:Tshirts,裤子,拖鞋(不好意思,没内裤~~)
Tshirts:
public class TShirts extends Finery{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Tshirt");
super.show();
}
}
裤子:
public class BigTrouser extends Finery{
@Override
public void show() {
System.out.println("大垮裤");
super.show();
}
}
拖鞋:
public class Slippers extends Finery{
@Override
public void show() {
System.out.println("拖鞋");
super.show();
}
}
最后在main方法组装:
public class Main {
public static void main(String[] args) {
Person p=new Person("小明");
System.out.println("准备衣服....");
TShirts ts=new TShirts();
BigTrouser bt=new BigTrouser();
Slippers s=new Slippers();
ts.Decorate(p);
bt.Decorate(ts);
s.Decorate(bt);
s.show();
}
}
运行结果:
准备衣服....
拖鞋
大垮裤
Tshirt
小明在穿衣服
上面的例子的装饰模式是利用Decorate方法来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
装饰模式通常用于:为已有的功能动态地添加更多功能的一种方式。当系统需要新的功能时,将新的功能的类包装旧的类,而无需修改原先的代码。当需要的时候,也可以根据需要有选择地使用装饰功能包装对象了。