您的位置:首页 > 其它

模式设计--装饰、外观模式

2016-06-05 13:17 429 查看

一、装饰模式

1、装饰模式包含的4个角色:(1)抽象构件,定义对象的接口;(2)具体构件,定义了具体的构件对象;(3)抽象装饰类(核心);(4)具体装饰类,它是抽象装饰类的子类。

2、装饰模式适用的范围:(1)在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责;(2)需要动态地给一个对象增加功能,这些功能也能被动态撤销;(3)当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

3、实例讲解:

题目:某图书管理系统中,书籍类(Book)具有借书方法borrowBook()方法和还书方法returnBook()。现在需要动态给该书籍对象添加冻结方法freeze()和遗失方法lose()。使用装饰模式设计该系统。绘制类图并编程实现。

1、装饰模式实验。

(1)通过分析实验内容,该实例类图如图1所示。

图1 装饰模式图书系统实例类图

(2)创建抽象构件类IBook,其中声明了borrowBook()和void returnBook()方法,这两个方法是具体构件类和装饰器类共有的。代码如下:

public interface IBook {

void borrowBook();

void returnBook();

}

(3)创建具体构件类Book,该类提供了borrowBook()和void returnBook()方法的实现,它是一个可以被装饰的类。代码如下:

public class Book implements IBook {

@Override

public void borrowBook() {

System.out.println(“我来借书的~”);

}

@Override

public void returnBook() {

System.out.println(“到期了,我来还书啦~”);

}

}

(4)抽象装饰类Changer。它是所有具体修饰类的父类,同时也是抽象构件的子类。它是装饰模式的核心。它定义了一个抽象构件类型的对象iBook,通过构造函数的方式给该对象赋值,同时它通过调用iBook中的方法来实现borrowBook()和void returnBook()方法。这样可以保证原有的方法不会被丢失,而且可以在它的子类中增加新的方法,扩展原有的对象的功能。代码如下:

public class Changer implements IBook {

private IBook ibook;//定义IBook的对象

public Changer(IBook ibook) {

this.ibook = ibook;//给成员变量ibook赋值

}

@Override

public void borrowBook() {

ibook.borrowBook();//调用ibook中的borrowBook()方法,保证原有法方法不丢失

}

@Override

public void returnBook() {

ibook.returnBook();//调用ibook中的returnBook()方法,保证原有法方法不丢失

}

}

(5)具体装饰类FreezeBook。它是Changer的子类,继承了其中的方法,同时新增了freeze()方法,实现书籍的冻结声明。代码如下:

public class FreezeBook extends Changer {

public FreezeBook(IBook ibook) {

super(ibook);

}

public void freeze(){//FreezeBook类中新增方法

System.out.println(“Sorry,该图书已被冻结!”);

}

}

(6)具体装饰类LoseBook。它是Changer的子类,继承了其中的方法,同时新增了lose()方法,实现书籍的遗失声明。代码如下:

public class LoseBook extends Changer {

public LoseBook(IBook ibook) {

super(ibook);

}

public void lose(){//LoseBook类中新增方法

System.out.println(“很不幸,这本书已经遗失了!”);

}

}

(7)编写客户端测试类Client。代码如下所示:

public class Client {

public static void main(String[] args) {

Book book = new Book();//创建Book对象

book.borrowBook();//调用book对象的borrowBook()方法

book.returnBook();//调用book对象的returnBook()方法

System.out.println(“————————-“);

FreezeBook freezeBook = new FreezeBook(book);//创建FreezeBook对象,将book对象注入FreezeBook实例对象中

freezeBook.borrowBook();//调用book对象的borrowBook()方法

freezeBook.returnBook();//调用book对象的borrowBook()方法

freezeBook.freeze();//调用freezeBook对象的freeze()方法

System.out.println(“————————-“);

LoseBook loseBook = new LoseBook(freezeBook);//创建LoseBook对象,将freezeBook对象注入LoseBook实例对象中

loseBook.borrowBook();

loseBook.returnBook();

loseBook.lose();//调用loseBook对象的lose()方法

}

}

三、实例代码下载

http://download.csdn.net/detail/leyezhiqiu/9507268
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式