歌手(Singer)有经纪人(Agent)来代理他的演出业务。一位经纪人也只代理一位歌手的业务。歌手有姓名属性(Name)和唱歌方法(Sing),经纪人也有姓名属性和唱歌方法,找经纪人去唱歌其实是通过他找他所代理的歌手去唱歌。请模拟场景:李辉是歌手华晨宇的经纪人,我们要通过李辉找华晨宇来唱歌。请选择合适的设计模式进行设计,可以较为详细地描述设计思路后画出类图,也可以简单描述设计思路后直接写出代码。(提示:main方法中要创建华晨宇这个歌手对象和李辉这个经纪人对象,然后打印一句:我是经纪人李辉,我安排歌手华晨宇唱歌。)
正确答案:
经过分析,可采用代理模式进行设计。
定义一个Isinger接口,在该接口中声明sing(唱歌)方法,Isinger充当抽象主题角色。定义一个Singer(歌手)类实现Isinger接口,充当真实主题角色,Singer类中有Name(字符串类型)属性。定义一个Agent(经纪人)类实现Isinger接口,充当代理主题角色,Agent类有Name(字符串类型)属性,和一个singer(Singer类型)属性指向他所代理的歌手。Agent类的构造方法带一个字符串类型参数和一个Singer类型参数,用于设置经纪人姓名和所代理的歌手。Singer的构造方法带一个字符串类型参数用于设置歌手姓名。Singer的Sing方法就打印一句:“歌手xxx唱歌。“(其中xxx是歌手的Name属性)。Agent类的Sing方法是先打印一句(该句无须换行):"我是经纪人xxx(其中xxx是经纪人的Name属性),我安排",然后调用其代理的歌手的Sing方法。
可以在场景类的main方法中定义两个Isinger引用singer1和singer2,以华晨宇为参数创建一个歌手对象并用singer1指向它,然后再以李辉和singer1为参数创建一个经纪人对象并用singer2指向它,最后调用singer2的Sing方法。