JAVA设计模式学习12——装饰器模式

2019-03-08 09:02|来源: 网络

装饰(Decorator)模式属于设计模式里的结构模式,通过装饰类动态的给一个对象添加一些额外的职责。装饰模式也叫包装(wrapper)模式。装饰模式有如下的角色:

抽象构件(component)角色:这个角色用来规范被装饰的对象,一般用接口方式给出。

具体构件(concrete component)角色:被装饰的类。

装饰(decorator)角色:持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。

具体(concrete decorator 装饰角色:负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。

装饰模式的类图如下:


装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下


  1. package decorator;  

  2.  

  3. public interface 女人 {  

  4.    public void 打扮();

  5. }  


  1. package decorator;  

  2.  

  3. public class 程序媛 implements 女人 {  

  4.  

  5.    @Override  

  6.    public void 打扮() {  

  7.        System.out.println("开始我是素颜。");  

  8.    }

  9. }  


  1. package decorator;  

  2.  

  3. public class 化妆 implements 女人 {  

  4.  

  5.    private 女人 女人;  

  6.    @Override  

  7.    public void 打扮() {  

  8.        女人.打扮();  

  9.    }  

  10.  

  11. }  


  1. package decorator;  

  2.  

  3. public class 画眉  extends 化妆 {  

  4.  

  5.    private 女人 女人;  

  6.      

  7.      

  8.    public 画眉(女人 女人) {  

  9.        super();  

  10.        this.女人 = 女人;  

  11.    }  

  12.  

  13.  

  14.    public void 打扮() {  

  15.        System.out.println("画眉了,漂亮了一些。");  

  16.        女人.打扮();  

  17.    }  

  18.  

  19. }  


  1. package decorator;  

  2.  

  3. public class 刷睫毛  extends 化妆 {  

  4.  

  5.    private 女人 女人;  

  6.      

  7.    public 刷睫毛(女人 女人) {  

  8.        super();  

  9.        this.女人 = 女人;  

  10.    }

  11.  

  12.    public void 打扮() {  

  13.        System.out.println("刷睫毛了,更漂亮了一些。");  

  14.        女人.打扮();  

  15.    }  

  16. }  


  1. package decorator;  

  2.  

  3. public class 涂口红  extends 化妆 {

  4.    private 女人 女人;

  5.      

  6.    public 涂口红(女人 女人) {  

  7.        super();  

  8.        this.女人 = 女人;  

  9.        打扮();  

  10.    }  

  11.  

  12.    public void 打扮() {  

  13.        System.out.println("有了口红,哇塞,狐狸精一个!");  

  14.        女人.打扮();  

  15.    }  

  16. }  


  1. package decorator;  

  2.  

  3. public class Client {  

  4.    /**

  5.     *作者:alaric

  6.     *时间:2013-7-22下午10:57:13

  7.     *描述:测试

  8.     */  

  9.    public static void main(String[] args) {

  10.        女人 女1 = new 程序媛();  

  11.        new 涂口红(new 刷睫毛(new 画眉(女1)));  

  12.    }  

  13. }  


运行结果:

有了口红,哇塞,狐狸精一个!

刷睫毛了,更漂亮了一些。

画眉了,漂亮了一些。

开始我是素颜。

通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。    
ps:最近重新学习设计模式,所写相关笔记纯属个人对书本和资料的理解,如有不到之处请大家指出,共同探讨学习设计模式。    

 
转自:http://alaric.iteye.com/blog/1911980

相关问答

更多
  • 其实我相信你做了3年的java一定了解你所说的设计模式和反射机制在程序早已用过了的把,只是自己平时没注意;设计模式主要是用项目管理,让人看起来通俗易懂.反射机制用到的地方呢也比较多,在用properties和JFreeChart等地方都用到.
  • 模式开扩了我们的视野,强化了我们面向对象编程的思维方式 提高代码的复杂度为代价来增强灵活性、可复用性 工厂模式根据工厂模式实现的类可以根据提供的数据 生成一组类中某一个类的实例,通常这组类有一个公共的 抽象父类或接口并且实现了相同的方法,但是这些方法针对不同 的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了 基类中的方法,然后需要定义一个工厂类,工厂类可以根据 条件生成不同子类的实例。 得到实例后,可以调用基类的方法而不必考虑到底 返回的是哪个子类的实例。 Factory(工厂 ...
  • 马学兵视频,W3C 教程,硅谷动力 视频教程等 先看视频,然后跟着做一遍。 最后下载一个 源码,尝试着模仿做几个 基本算入门了
  • 你是准备学习使用 还是说研究它的底层实现机制这些东西? 如果只是使用 可以暂时不了解这些 ,你也没有这么多精力来了解这么多 你先将框架中的东西用熟练 然后再去了解这些也不迟 spring 的 IOC aop hibernate的 延迟加载 缓存 ,mvc这些学习都需要学习 其实你学习不学习这几个框架都可以对设计模式进行学习 设计模式在日常的版本开发中好处很多 而且在面试的时候 考官也会问设计模式方面的知识
  • 一般来说电驴(verycd)里面可以下载,那里面的资源很多。希望这个对你有帮助
  • 装饰者模式就是动态的给对象添加一些职责。就功能来说装饰着模式相对与生成子类更加灵活。 当然继承也能实现该功能,但是面向对象的基本原则之一就是:少用继承,多用组合。 java.util中set就是,hashset和collection的源码很容易看出,他们是装饰者模式的构造。
  • 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 举例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 publicclassTest { // 将内容写到另一个文件 publicvoidwrite() { String string = "测试包装模式"; try{ FileWriter fw = newFileWriter("D:/copyfi ...
  • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 java设计模式是当你在实际的系统当中遇到重构或者扩展的时候采取的一种对现有系统影响最小的一种措施。当然并不是一定要学这个东西,就像一个没上过学的人和上过学的人,在个人修养上面存在一定的差异,但是他们都 ...