需求:设计一个系统,可以给人装饰不同的服饰,例如:帽子,T恤,背心,帆布鞋等等。
分析:我们都知道人的服饰是各种各样的,是不确定的,也就是说不同的人可以有不同的装饰,一个人也可以换不同的服饰,要设计这样一个可以动态换服饰的系统,我们会选择使用装饰者模式来设计,这是一个经典的设计模式,相信很多人都知道。
设计步骤:
第一步:创建对象Person,也就是我们需要装饰的对象,对象里面有一个属性name,就是人的名字,提供getter和setter方法,人还有一个show()方法,就是显示自己的服饰的一个行为。
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("装扮的" + this.name);
}
}
第二步:抽象出一个服饰类Finery,继承Person类,
对人进行装饰,也就是把人和服饰分离开,进而可以给人动态选择不同的服饰,在Finery类里面存放一个Person属性,可以通过decorate方法动态设置需要修饰的Person对象,同时重写父类的show方法。
//服饰类,对人进行修饰
public class Finery extends Person {
private Person component;
public void decorate(Person component) {
this.component = component;
}
@Override
public void show() {
if (component != null) {
component.show();
}
}
}
第三步:创建三个不同的服饰,分别是TShirts,BigTrouser, Sneakers,这三个类都继承Finery类,重写父类的show方法,重写的时候,先添加服饰的特点,然后调用父类的show方法。
public class TShirts extends Finery {
@Override
public void show() {
System.out.println("大T恤");
super.show();
}
}
public class BigTrouser extends Finery {
@Override
public void show() {
System.out.println("垮裤");
super.show();
}
}
public class Sneakers extends Finery {
@Override
public void show() {
System.out.println("破球鞋");
super.show();
}
}
第四步:最后肯定就是测试了,例如现在小明要装饰自己,要穿T恤,垮裤,还有鞋子。我们先创建一个Person对象,然后创建三种不同的服饰,依次对小明进行修饰,最后显示小明的装饰,装饰的过程其实是一个递归过程,好好体会,如果现在小明需要更换不同的服饰的话,只需要添加添加新的服饰类,然后对小明进行装饰就行了,如果我们不使用装饰者模式,不对人和服饰进行分离的话,我们需要修改的代码时很多的,不妨试试~~
//测试
public class Test {
public static void main(String[] args) {
Person xiaoming = new Person();
xiaoming.setName("小明");
TShirts ts = new TShirts();
BigTrouser bt = new BigTrouser();
Sneakers sk = new Sneakers();
//装饰过程
ts.decorate(xiaoming);
bt.decorate(ts);
sk.decorate(bt);
sk.show();
}
}
程序运行的结果如下:
破球鞋
垮裤
大T恤
装扮的小明