V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Mutoo
V2EX  ›  问与答

[趣题]用面向对象的编程思想描述一个故事

  •  
  •   Mutoo · 2011-12-06 22:40:18 +08:00 · 4437 次点击
    这是一个创建于 4736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    临近期末了,敏捷开发老师布置了一个很有新意的题目:

    1)用面向对象的编程思想描述一个故事
    - 可选取童话故事
    - 可自己编故事
    - 故事主题不限
    2)用面向对象的语言
    3)至少应用十种设计模式
    4)表现形式不限,但必须有文本输出故事内容。
    5)故事篇幅:文本输出至少1000字

    不知道大家可有什么好主意否?
    10 条回复    1970-01-01 08:00:00 +08:00
    lldong
        1
    lldong  
       2011-12-06 22:55:27 +08:00
    这算作弊吗?
    Rice
        2
    Rice  
       2011-12-06 23:13:20 +08:00
    这个……
    Rice
        3
    Rice  
       2011-12-06 23:13:31 +08:00
    怎么做啊?
    yesmeck
        4
    yesmeck  
       2011-12-06 23:14:01 +08:00
    为什么我想到了动物世界。。。
    Mutoo
        5
    Mutoo  
    OP
       2011-12-06 23:52:28 +08:00
    @lldong 这个主题只是用于讨论。我已经开始在做了,我尝试写三只小猪。
    ThreeLittePigs类 实现 故事书(Story)类 接口模式+1
    旁白(Aside) 单例模式+1
    实例化猪妈妈与三只小猪(Mother Pig/1st,2nd,3rd Pig)(IObservable),然后讲话的时候传递给旁白(IObserver),旁白再输出转述 观察者模式+1
    ...
    Mutoo
        6
    Mutoo  
    OP
       2011-12-06 23:54:55 +08:00
    @yesmeck hah,差不多,我想到三只小猪……


    Aside: Hi! I am the Aside.
    Mother Pig: Hi! I am the Mother Pig
    First Little Pig: Hi! I am the First Little Pig
    Second Little Pig: Hi! I am the Second Little Pig
    Third Little Pig: Hi! I am the Third Little Pig
    ==========
    Three Little Pigs
    Author: Unknown
    ==========
    Aside: There are three little pigs.
    Aside: They live in a small house with their their mother.
    "This house is too small. The three of you must leave home. You must build your own homes," says the Mother Pig.
    eric_zyh
        7
    eric_zyh  
       2011-12-07 11:22:20 +08:00
    女娲造人,很面向对象的。。

    以前看过一本 《java与模式》 。 里面扯些老子的东西来将面向对象。 可以参考一下。
    reus
        8
    reus  
       2011-12-08 13:04:21 +08:00
    既然是敏捷老师布置的,那当然得用些迭代渐进之类的方法吧
    第一版就直接用story.tell(),这样直接可以满足五个要求里的四个了~

    第二版加上单例模式啊,Story.getSingleton().tell()

    第三版加上代理模式,StoryTeller.getSingleton().tell(Story.getSingleton())

    第四版加上Adapter,我们没有StoryTeller只有Singer,怎么办呢
    SingerStoryTellingAdapter<Singer>().tell(Story.getSingleton())

    第五版,getter/setter貌似也是个设计模式是吧
    SingerStoryTellingAdapter<Singer>()
    .tell(Story.getSingleton().setText(story_text).getText())

    第六版加上Factory模式啊
    StoryTellerFactory<SingerStoryTellingAdapter<Singer>>()
    .tell(Story.getSingleton().setText(story_text).getText())

    第七版,一个Factory不够啊,怎么也得上Abstract Factory吧
    abstract class TellerFactory {...}
    abstract class StoryTellerFactory extends TellFactory {...}
    class SimpleStoryTellerFactory extends StoryTellerFactory {...}

    SimpleStoryTellerFactory<SingerStoryTellingAdapter<Singer>>()
    .tell(Story.getSingleton().setText(story_text).getText())

    第八版,来个Chain of Responsibility
    abstract class TellerFactory {...}
    abstract class StoryTellerFactory extends TellFactory {...}
    class SimpleStoryTellerFactory extends StoryTellerFactory {...}

    StoryTellingRequestHandler()
    .setSuccessor(StoryTellingRequestConcreteHandler()
    .setSuccessor(
    SimpleStoryTellerFactory<SingerStoryTellingAdapter<Singer>()
    )
    )
    .handleRequest(RequestType.TELL,
    Story.getSingleton().setText(story_text).getText())

    第九版,Builder和Prototype都用上了吧
    story_text = StoryTextPrototypeBuilder().clone("Once upon a time...")

    abstract class TellerFactory {...}
    abstract class StoryTellerFactory extends TellFactory {...}
    class SimpleStoryTellerFactory extends StoryTellerFactory {...}

    StoryTellingRequestHandler()
    .setSuccessor(StoryTellingRequestConcreteHandler()
    .setSuccessor(
    SimpleStoryTellerFactory<SingerStoryTellingAdapter<Singer>()
    )
    )
    .handleRequest(RequestType.TELL,
    Story.getSingleton().setText(story_text).getText())

    第十版,Decorate一下,让字符串对象可以直接当作故事来讲
    abstract class TellerFactory {...}
    abstract class StoryTellerFactory extends TellFactory {...}
    class SimpleStoryTellerFactory extends StoryTellerFactory {...}

    void String::tellAsStory() {
    story_text = StoryTextPrototypeBuilder().clone(this)
    StoryTellingRequestHandler()
    .setSuccessor(StoryTellingRequestConcreteHandler()
    .setSuccessor(
    SimpleStoryTellerFactory<SingerStoryTellingAdapter<Singer>()
    )
    )
    .handleRequest(RequestType.TELL,
    Story.getSingleton().setText(story_text).getText())
    }

    然后我们就可以这样用了:
    "Once upon a time...".tellAsStory()

    …………………………好吧叔叔不行了…………………………
    Air_Mu
        9
    Air_Mu  
       2011-12-08 13:17:32 +08:00
    我想起了当时那个用ML做比喻生动的描述面向对象思想的故事....
    Mutoo
        10
    Mutoo  
    OP
       2011-12-08 20:33:49 +08:00
    @reus 膜拜一下,但是老师的要求好像是用面向对象思想构造故事里的情节及元素
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1320 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:54 · PVG 01:54 · LAX 09:54 · JFK 12:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.