小菜写的第三份代码:
1、Person类(ConcreteComponent)
- 照常不变,与第二份代码里一样。
public class Person {
private String name;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public void Show() {
System.out.println("爱打扮的" + name);
}
}
2、服饰类(Decorator)
- 即继承于Person类,又在类里安排一个Person类型的属性。
– 这个component对象就是代码的关键部分,继承+包含 这样才体现出嵌套的感觉出来。- 至于方法也都是针对这个Person属性的component对象进行:
1、Decorate(Person component) 对this.component对象进行赋值。
2、 public void Show() 展示this.componen对象的具体内容。
public class Finery extends Person {
private Person component;
public Finery() {
super();
}
public Finery(String name) {
super(name);
}
public Finery(Person component) {
super();
this.component = component;
}
public void Decorate(Person component) {
this.component = component;
}
public void Show() {
if(component != null) {
component.Show();
}
}
}
3、具体服饰类(ConcreteDecorator)
- 继承于Finery抽象服饰类,这些具体服饰类大部分都一样,就对Show()方法的重写不一样罢了。
// 1、T恤类
public class TShirts extends Finery {
public TShirts() {
super();
}
public TShirts(Person component) {
super(component);
}
public TShirts(String name) {
super(name);
}
public void Show() {
System.out.print("大T恤 ");
super.Show();
}
}
// 2、垮裤类
public class BigTrouser extends Finery {
public BigTrouser() {
super();
}
public BigTrouser(Person component) {
super(component);
}
public BigTrouser(String name) {
super(name);
}
public void Show() {
System.out.print("垮裤 ");
super.Show();
}
}
// 3、皮鞋类
public class WearLeatherShoes extends Finery {
public WearLeatherShoes() {
super();
}
public WearLeatherShoes(Person component) {
super(component);
}
public WearLeatherShoes(String name) {
super(name);
}
public void Show() {
System.out.print("皮鞋 ");
super.Show();
}
}
// 4、球鞋类
public class WearSneakers extends Finery {
public WearSneakers() {
super();
}
public WearSneakers(Person component) {
super(component);
}
public WearSneakers(String name) {
super(name);
}
public void Show() {
System.out.print("破球鞋 ");
super.Show();
}
}
// 5、西装类
public class WearSuit extends Finery {
public WearSuit() {
super();
}
public WearSuit(Person component) {
super(component);
}
public WearSuit(String name) {
super(name);
}
public void Show() {
System.out.print("西装 ");
super.Show();
}
}
// 6、领带类
public class WearTie extends Finery {
public WearTie() {
super();
}
public WearTie(Person component) {
super(component);
}
public WearTie(String name) {
super(name);
}
public void Show() {
System.out.print("领带 ");
super.Show();
}
}
4、客户端代码
xc --> pqx.Decorate(xc); --> kk.Decorate(pqx); --> dtx.Decorate(kk);
- 就是这么一层层赋值嵌套去实现组装。
public class zTest2 {
public static void main(String[] args) {
Person xc = new Person("小菜");
System.out.println("小菜的第一套打扮:");
WearSneakers pqx = new WearSneakers();
BigTrouser kk = new BigTrouser();
TShirts dtx = new TShirts();
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.Show();
System.out.println("小菜的第二套打扮:");
WearLeatherShoes px = new WearLeatherShoes(xc);
WearTie ld = new WearTie(px);
WearSuit xz = new WearSuit(ld);
xz.Show();
}
}
5、输出结果
小菜的第一套打扮:
大T恤 垮裤 破球鞋 爱打扮的小菜
小菜的第二套打扮:
西装 领带 皮鞋 爱打扮的小菜
总结:
这份代码确实是一份成熟的装饰模式代码,在代码结构上,严格地遵守了开放-封闭原则,“什么该抽象什么该具体?”都正确的实现了。代码看上去非常的美观简洁,Person—Finery—TShirts(……)三连继承,并且在Finery中安置了父类Person属性的对象,从而实现了嵌套装饰。在现实生活中,就好像你穿外套是套在卫衣的外面的感觉,而不是你什么都不穿直接套外套。还有一点,这个要区别于建造者模式,感兴趣可以看下了解关键区别点