由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 说说Decorator那个题
相关主题
一道design pattern的问题关于object oriented design的题目
Scala语法相关。在给定的class里想实现comparableAmazon 电面
Design Pattern Question - Decorator弯曲中型IT公司面经
请问女士面试时需要穿丝袜吗?老印找工作的确牛
amazon第三轮电面MathWorks onsite面经
Amazon 电面经历on-site 面经
讨论:关于一个design 问题请牛人推荐复习面试设计模式的书
amazon的那道题目Linkedin上收到的信息
相关话题的讨论汇总
话题: person话题: public话题: finery话题: decorator话题: caller
进入JobHunting版参与讨论
1 (共1页)
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?
1 (共1页)
进入JobHunting版参与讨论
相关主题
Linkedin上收到的信息amazon第三轮电面
zynga, linkedin, epic, two sigma, facebook面经Amazon 电面经历
hasNext的迭代器题怎么做?讨论:关于一个design 问题
问道设计题amazon的那道题目
一道design pattern的问题关于object oriented design的题目
Scala语法相关。在给定的class里想实现comparableAmazon 电面
Design Pattern Question - Decorator弯曲中型IT公司面经
请问女士面试时需要穿丝袜吗?老印找工作的确牛
相关话题的讨论汇总
话题: person话题: public话题: finery话题: decorator话题: caller