资源描述
烟台大学计算机与控制工程学院 软件素养(3)
烟 台 大 学
软件素养(3)大作业
专业: 软件工程
班级:___计控124-4 ___
姓名: 邱学伟
学号: 201258504405
2014.12.6
1.涉及模式介绍
(1) 装饰者模式
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰模式中,“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。
(2) 代理模式
代理模式是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式是为对象提供一个代理,代理可以控制对它所代理的对象的访问。 代理模式最常见的两种情况:远程代理和虚拟代理。 为其他对象提供一种代理以控制对这个对象的访问。
(3) 观察者模式
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的独享都得到通知并自动刷新。在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
2.详细的类图设计
(1) 装饰模式
某图书管理系统中,书籍类(Book)具有借书方法borrowBook()和还书方法returnBook() 。现需要动态给书籍对象添加冻结方法freeze()和遗失方法lose()。使用装饰模式设计该系统,绘制类图并编程实现。
(2) 代理模式
应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法。使用代理模式模拟该过程,绘制类图并编程实现。
(3) 观察者模式
某在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统,绘制类图并编程实现。
3.代码列表
(1) 装饰模式
package DirectorPattern;
interface Book
{
void borrowBook();
void returnBook();
}
final class MyBook implements Book
{
public void borrowBook(){
System.out.println("MyBook borrowing!");
}
public void returnBook(){
System.out.println("MyBook returning!");
}
}
abstract class BookDirector implements Book
{
private Book book;
public BookDirector(Book book)
{
System.out.println("Book directoring!");
this.book=book;
}
public void borrowBook(){
book.borrowBook();
}
public void returnBook(){
book.returnBook();
}
}
class NewBook extends BookDirector
{
public NewBook(Book book)
{
super(book);
System.out.println("Book changed to NewBook!");
}
public void freeze()
{
System.out.println("Book freezing!");
}
public void lose()
{
System.out.println("Book lost!");
}
}
public class BookDirectorClient {
public static void main(String a[])
{
//半透明
Book book=new MyBook();
NewBook newBook=new NewBook(book);
newBook.borrowBook();
newBook.returnBook();
newBook.freeze();
newBook.lose();
}
}
(2) 代理模式
package ProxyPattern;
interface Software
{
void run();
}
class Application implements Software
{
public void run()
{
System.out.println("Application is running!");;
}
}
class Picture implements Software
{
private Application app=new Application();
public void run(){
app.run();
}
}
public class FastwayProxyClient
{
public static void main(String a[])
{
Software proxy=new Picture();
proxy.run();
}
}
(3) 观察者模式
package ObserverPattern;
import java.util.*;
//某在线股票软件需要提供如下功能:
//当股票购买者所购买的某支股票价格变化幅度达到5%时,
//系统将自动发送通知(包括新价格)给购买该股票的股民。
//现使用观察者模式设计该系统,绘制类图并编程实现。
interface MyObserver
{
void response();
}
abstract class MySubject
{
private Vector v=new Vector();
public void addObserver(MyObserver observer)
{
this.v.add(observer);
}
public void deleteOberver(MyObserver observer)
{
this.v.remove(observer);
}
public void fireNotice()
{
for(int i=0;i<v.size();i++)
{
((MyObserver)v.elementAt(i)).response();
}
}
}
//具体目标
class IBMStock extends MySubject
{
private double price;
IBMStock(double price){
this.price=price;
}
public double getPrice() {
return price;
}
public void setPrice(double priceNew) {
double change=this.price-priceNew;
this.price = priceNew;
if(change/this.price>0.05||change/this.price<-0.05){
super.fireNotice();
}
}
}
//具体观察者
class Stocker implements MyObserver
{
private String name;
private IBMStock subject;
public Stocker(String name,IBMStock subject)
{
this.name=name;
this.subject=subject;
subject.addObserver(this);
}
public void response() {
System.out.println("股民 "+name+" 被通知IBM股票发生了变化,新价格为:"+subject.getPrice());
}
}
public class ObserverClient
{
public static void main(String a[])
{
IBMStock stock=new IBMStock(1000.00);
Stocker ob1 =new Stocker("jack",stock);
Stocker ob2 =new Stocker("rose",stock);
stock.setPrice(1500);
stock.setPrice(1501);
stock.setPrice(100);
}
}
4.个人体会
装饰模式优点:
• 被装饰者和装饰者是松耦合关系。由于装饰(Decorator)仅仅依赖于抽象组件(Component),因此具体装饰只知道它要装饰的对象是抽象组件的某一个子类的实例,但不需要知道是哪一个具体子类。
• 装饰模式满足“开-闭原则”。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。
• 可以使用多个具体装饰来装饰具体组件的实例。
代理模式优点:
• 代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦。
• 使用代理来担当那些创建耗时的对象的替身。
观察者模式优点:
• 具体主题和具体观察者是松耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口,因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例,但不需要知道具体是哪个类。同样,由于观察者仅仅依赖于主题(Subject)接口,因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例,但不需要知道具体是哪个类。
• 观察模式满足“开-闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口,因此如果增加新的实现观察者(Observer)接口的类,不必修改创建具体主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题(Observer)接口,如果增加新的实现主题(Subject)接口的类,也不必修改创建具体观察者类的代码。
5.教师评语
13
展开阅读全文