|
|
|
|
|
|
g**********y 发帖数: 14569 | 1 原帖见:http://www.mitbbs.com/article_t/JobHunting/32015883.html
说实在,那个主函数是一个很糟糕的写法,没有错误,但是awfully done。
现代软件工程的核心就是:代码易读易改。要做到这点,你的写法就不能违反直觉。
sneaker.Decorate(Alice); <-------------------------
trouser.Decorate(sneaker); 就是这一段看不明白!!!!!
tshirt.Decorate(trouser); 虚函数+覆写函数 咋有递归的感觉
tshirt.Show(); <-------------------------
code里用了英文单词,但是表达的完全不是那个意思,那就是对后来维护的人一种折磨。
Decorator的核心就是一个operation, 经过一条链来处理。这条链是可以动态增加的。
从结果看,你希望达到的效果就是:
decoratedObj.act()会依次call链上的每一个decorator的act()
要达到这种效果,那每个decorator需要知道前一个object, 这个可以通过creation来
实现(也可以象原code那样call Decorate()传进去);然后需要返回自己,这样下一个
decorator才链接上。
为了实现以上的目的,我们需要给这些decorator定义一个公用的parent class, 简单
地说,
public class Decotorator {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void act() {
this.component.act();
}
}
啰嗦完,把那个code稍微改一下就是:
public class Person {
private String name;
public Person() {}
public Person(String name) {
this.name = name;
}
public void show() {
System.out.print("Decorated person is " + this.name + ".");
}
public static void main(String[] args) {
Person p = new Person("Alice");
Finery decorated = new TShirt(new BigTrouser(new Sneakers(p)));
decorated.show();
}
}
class Finery extends Person {
protected Person caller;
public Finery(Person caller) {
this.caller = caller;
}
public void show() {
caller.show();
}
}
class TShirt extends Finery {
public TShirt(Person caller) {
super(caller);
}
public void show() {
System.out.print("TShirt ");
caller.show();
}
}
class BigTrouser extends Finery {
public BigTrouser(Person caller) {
super(caller);
}
public void show() {
System.out.print("BigTrouser ");
caller.show();
}
}
class Sneakers extends Finery {
public Sneakers(Person caller) {
super(caller);
}
public void show() {
System.out.print("Sneakers ");
caller.show();
}
}
最后的主函数就是三句:
Person p = new Person("Alice");
Finery decorated = new TShirt(new BigTrouser(new Sneakers(p)));
decorated.show();
翻译成大白话:给人穿衣,穿裤,穿鞋,然后:
奔! | r****t 发帖数: 10904 | 2 为啥 Finery extends Person? | g**********y 发帖数: 14569 | 3 Finery就是Decorator的基础类,作为基础类,必须实现原来class里想要做成链式传递
的function, extend Person就是最容易的选择。如果你用use的关系,链象这个样子:
Decorator1() -> Decorator2() -> Decorator3() -> ....
Decorator1显然只能接受Person, Decorator2和其它的,要接受Finery, 而Finery不继
承Person, 那这条链形式上就不是完全一致的,就没办法随便交换Decorator的次序。
【在 r****t 的大作中提到】 : 为啥 Finery extends Person?
| z****u 发帖数: 104 | 4 衣服可以穿在人身上,而且只能穿在人身上(不能直接穿在衣服身上)
实际上Finery在这里的意思不是衣服,而是穿了某件衣服的人,也就是说 Tshirt*
object; 是声明了一个穿了 Tshirt 的人,这样你就可以在这个人身上继续穿衣服
这里的C++代码比较好的解释了这个pattern
http://www.vincehuston.org/dp/decorator.html
【在 r****t 的大作中提到】 : 为啥 Finery extends Person?
|
|
|
|
|
|
|