当前位置:文档之家› 实验二观察者模式与装饰模式

实验二观察者模式与装饰模式

实验二观察者模式与装饰模式The following text is amended on 12 November 2020.实验报告课程名称java设计模式实验项目观察者模式与装饰模式的应用实验仪器 PC个人终端系别计算机学院专业软件工程班级/学号学生姓名阮翀实验日期 2015-10-12成绩指导教师张志华实验二观察者模式与装饰模式的应用一、实验目的通过该实验,理解观察者模式和装饰模式的意图、结构,在软件开发中使用这些模式并进行功能验证。

二、实验内容1.猫、狗与老鼠。

假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。

2.我跟妈妈说:“妈妈,我和妹妹在院子里玩。

饭做好了叫我们一声。

”请用观察者模式设计一个模拟系统。

3.采用装饰模式为图书馆中的项目(书或音像盘)增加“可借”功能。

使用Java语言设计一个模拟系统。

4.自定义JButton。

开发人员设计用户接口时,通常需要更多有特色的控件,Decorator模式就提供了一个方法去创造或修改现有的UI控件。

使用装饰模式实现一个带有对角线的按钮。

三、实验步骤与要求1.对于以上题目要认真分析和理解题意,在观察者模式和装饰模式题目中各选1个进行编程,程序中要求使用相应的模式。

2.上机录入,使用JDK编译器调试、运行、验证程序。

3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。

四、实验原理:在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,此时可以采用观察者模式。

观察者模式意图:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

”观察者模式的UML类图:装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。

装饰模式意图:“动态地给对象添加一些额外的职责。

就功能来说装饰模式相比生成子类更为灵活。

”装饰模式的UML类图:五、上机报告内容1、班级、学号、姓名、实验完成日期;2、实验题目;3、设计方案:给出你的设计方案,包括结构类图及相关说明;4、源代码:设计方案中各个类和接口的源代码,包括测试主类的源代码.5、测试数据及运行结果6、总结:1)运用设计模式总结:对所运用的设计模式的名称,分类,意图,结构,角色作用的总结,所运用的面向对象设计原则。

2)选择一个题目进行说明:如果不使用观察者模式和装饰模式,你能想到其他方法解决问题吗,简要描述你的方案,并和采用命令模式的方案做简单比较。

3)本次实验遇到的问题、如何解决的;本次实验的经验、体会、改进设想等。

六、实验成绩考核方法实验成绩由出勤、实验完成情况以及实验报告综合评定。

考核成绩比例分配:出勤占15%、实验完成情况占50%、实验报告占35%七、上机安排本实验共需2个学时。

观察者模式public interface Subject {public void addObserver(Observer o);public void deleteObserver(Observer o);public void notifyObservers();}public interface Observer {public void SayHi(String heardMess);}public class Mouse implements Observer{public Subject subject;public Mouse(Subject subject){= subject;(this);}public void SayHi(String heardMess) {"我是观察者——老鼠,吱吱吱,我跑了!=。

=");}}public class Dog implements Observer {public Subject subject;public Dog(Subject subject) {= subject;(this);}public void SayHi(String heardMess) {"我是观察者——狗,犬吠~");}}importpublic class Cat implements Subject {String mess;boolean changed;ArrayList<Observer> animalsList;public Cat() {animalsList = new ArrayList<Observer>();mess = "Hi";changed = false;}public void addObserver(Observer o) {if (!(o))) {(o);}}@Overridepublic void deleteObserver(Observer o) {if (o)) {(o);}}@Overridepublic void notifyObservers() {for (int i = 0; i < (); i++) {Observer observer = (i);(mess);}}}public class Application {public static void main(String args[]){Cat newcat = new Cat();@SuppressWarnings("unused")Dog newdog = new Dog(newcat);String str = "我是猫,喵喵喵~";@SuppressWarnings("unused")Mouse newmouse = new Mouse(newcat);();}}装饰模式public abstract class Library {public abstract String book();}public class book extends Library{public final String str1= "tushu1";public String book() {return str1;}}public class BookDecorator extends Decorator{public final String STR = "可借";BookDecorator(Library library) {super(library);}public String newDecorator(){return STR;}@Overridepublic String book() {String str = null;str = () + newDecorator();return str;}}public abstract class Decorator extends Library{ protected Library library;public Decorator(){};public Decorator(Library library){= library;}}public class Application {public void showBook(Library library){String ste = ();}public static void main(String args[]){Application C = new Application();Library book = new book();Library at1 = new BookDecorator(book);Library at2 = new BookDecorator(at1);(at1);(at2);}}总结观察者模式观察者模式中通常有两个基本的概念主题:观察者和被观察者。

当被观察者状态发生改变时,需要通知相应的观察者,当然,每个被观察者所对应的观察者可能不知一个,他们之间是1:n的关系。

当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化。

观察者模式的效果有以下的优点:1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。

2.被观察者会向所有的登记过的观察者发出通知,观察者模式有下面的缺点:1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2.如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。

3.如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

4.虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。

装饰模式装饰模式是是为己已有的功能到哪个态地添加更多功能的一种方式,当系统需要新功能的时候,要想旧类中添加新的代码,这些新的代码通常转世了原油类的核心职责或主要行为,在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类复杂性的特殊行为的需要,而装饰模式且提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个了类包装它所要装饰的对象,一次,当需要执行特殊行为时,客户端代就可以在云系那个时根据需要有选择地,按照顺帝使用装饰功能包装的对象了。

装饰者模式优点1、装饰者模式可以提供比继承更多的灵活性2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

装饰者模式缺点1、会产生很多的小对象,增加了系统的复杂性2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

6、装饰者会导致设计中出现许多的小对象,如果过度的使用,会让系统变得更加复杂。

7、装饰者和被装饰者对象有相同的超类型。

(装饰类和被装饰类之间的关系要搞清楚)。

相关主题