一位羽毛球明星(badminton star)球星可以被多位球迷(fan)关注而一位球迷也可以
关注多位球星。球星有赢球(win)方法,当一位球星赢球时会通知所有关注他的球迷,
球迷会高兴地为他庆祝。张明关注林丹,李雪关注李宗伟,陈强同时关注林丹和李宗伟。
现在林丹先赢球了,然后李宗伟再赢球了。请选择合适的设计模式进行设计。
正确答案:
经过分析,可以采用观察者模式进行设计。
羽毛球明星类是具体的被观察者(具体目标),继承自java.util.Observable类,有姓名属性,有赢球方法,赢球方法的实现是先调用setChanged方法(继承自Observable类),然后再调用notifyObservers方法(继承自Observable类,传递的参数是球星的姓名)。当一个羽毛球明星对象的notifyObservers方法被调用时会依次调用到这个对象的
所有观察者对象的update方法,通知这些观察者对象们。
球迷类是具体的观察者,实现java.util.Observer接口,有姓名属性,其update方法(update方法是在Observer接口中声明的)的实现是打印xx(此处xx是球迷的姓名)很高兴,球星yy(yy是update方法的第二个参数,代表传递的消息即赢球球星的姓名,update方法的第一个参数代表通知该观察者对象的被观察者对象即赢球球星对象)赢球了。
在main方法中声明两个羽毛球明星引用,让第一个引用指向创建的第一个羽毛球明星对象—林丹,让第二个引用指向创建的第二个羽毛球明星对象—李宗伟,声明三个球迷引用,分别创建三个球迷对象张明、李雪、陈强并让这三个球迷引用分别指向它们。调用林丹的addobserver方法(addobserver方法继承自observable类,用于将观察者对象添加到观察者列表中)来添加他的球迷张明和陈强(调用两次,第一次的参数是张明,第二次是陈强);调用李宗伟的addobserver方法来添加他的球迷李雪和陈强(调用两次,第一次的参数是李雪,第二次是陈强)。调用林丹的赢球方法(这时会打印出 张明很高兴,球星林丹赢球了 和陈强很高兴,球星林丹赢球了 )和李宗伟的赢球方法(这时会打印出 李雪很高兴,球星李宗伟赢球了和陈强很高兴,球星李宗伟赢球了)。(这里是用jdk中的Observable和Observer分别充当抽象目标和抽象观察者,也可以自己定义抽象目标和抽象观察者)