现在有一个需求:设计一个QQ秀,可以随意搭配服饰。
直接将上代码~~~
父类的父类Person(为什么需要父类的父类:乍看父父类其实是可有可无的,但如果删掉,你会发现父类Finery的decorate无法放装饰者)
package DecoratorPattern;
public class Person {
public Person(){
}
private String name;
public Person(String name ){
this.name = name;
}
public void Show(){
System.out.println("装扮的"+name);
}
}
父类Finery
package DecoratorPattern;
public class Finery extends Person{
protected Person component;
public void Decorate(Person component){
this.component = component;
}
@Override
public void Show() {
if(component != null){
component.Show();
}
}
}
子类FinerySon
class TShirts extends Finery{
@Override
public void Show() {
// TODO Auto-generated method stub
System.out.println("大Tshirt");
super.Show();
}
}
class BigTrouser extends Finery{
@Override
public void Show() {
// TODO Auto-generated method stub
System.out.println("垮裤");
super.Show();
}
}
class Shoes extends Finery{
@Override
public void Show() {
// TODO Auto-generated method stub
System.out.println("鞋子");
super.Show();
}
}
界面代码(decorater()和Show()两个方法是设计者模式的精髓,首先说一下decorator(),ts调用decorator方法,我们知道ts本身是没有这个方法的,都是从父类Finery里面调用,在这个方法里面,xc对象作为参数赋值给了父父类Person,这是为后面的show()作铺垫,如果不理解,先看后面,之后同理,bt,st都让前一个对象作为参数赋值给了父父类,我猜你可能会疑惑,为什么要让Person这个对象被“重置”了这么多次呢,有什么用呢,我们再看下去就知道了,关键的show()出来了,st调用show()我们可以点进去看看过程是怎么实现,首先输出'“鞋子”,然后调用了super.show(),st的super是Finery,Finery调用show是调用Person的show(),而Person正式被装饰了,被bt赋值了!!所以,其实super.show()调用的是bt的show,所以再输出“垮裤”,然后执行bt.show()的super.show(),调用了Tshirt的show... ... )
package DecoratorPattern;
public class Main {
public static void main(String[] args) {
Person xc = new Person("小菜");
System.out.println("第一种装扮");
Finery ts = new TShirts();
Finery bt = new BigTrouser();
Finery st = new Shoes();
ts.Decorate(xc);
bt.Decorate(ts);
st.Decorate(bt);
st.Show();
}
}
结果:
说一下装饰者模式的用优点吧:首先他符合开放封闭原则,当你需要添加装饰类的时候(帽子,裤子之类)不需要对本身已经结构严谨的代码进行“破坏”,其次
什么时候使用装饰者模式:当我们需要往原系统添加新功能的时候,新功能往往只起到了装饰原系统的核心功能~~另外客户可以按顺兴地包装对象了。