avatar
research papers $5000up# Joke - 肚皮舞运动
g*y
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();
翻译成大白话:给人穿衣,穿裤,穿鞋,然后:
奔!
avatar
F*D
2
【 以下文字转载自 FleaMarket 讨论区 】
发信人: zwc1980 (侠女行), 信区: FleaMarket
标 题: research papers $5000up
发信站: BBS 未名空间站 (Sat Sep 24 21:12:18 2011, 美东)
Pay $5000 up for the English research paper on economics and management
which must be searched by SCI\SSCI\EI\A&HCI. Serious collaborator please
contact: C***********[email protected]
avatar
r*t
3
为啥 Finery extends Person?
avatar
g*y
4
Finery就是Decorator的基础类,作为基础类,必须实现原来class里想要做成链式传递
的function, extend Person就是最容易的选择。如果你用use的关系,链象这个样子:
Decorator1() -> Decorator2() -> Decorator3() -> ....
Decorator1显然只能接受Person, Decorator2和其它的,要接受Finery, 而Finery不继
承Person, 那这条链形式上就不是完全一致的,就没办法随便交换Decorator的次序。

【在 r****t 的大作中提到】
: 为啥 Finery extends Person?
avatar
z*u
5
衣服可以穿在人身上,而且只能穿在人身上(不能直接穿在衣服身上)
实际上Finery在这里的意思不是衣服,而是穿了某件衣服的人,也就是说 Tshirt*
object; 是声明了一个穿了 Tshirt 的人,这样你就可以在这个人身上继续穿衣服
这里的C++代码比较好的解释了这个pattern
http://www.vincehuston.org/dp/decorator.html

【在 r****t 的大作中提到】
: 为啥 Finery extends Person?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。