模式设计--装饰、外观模式
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相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用