zoukankan      html  css  js  c++  java
  • 装饰者模式

    装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    装饰者模式的特点:

    (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
    (2) 装饰对象包含一个真实对象的引用(reference)
    (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
    (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

    装饰者模式的适用范围:

    1. 需要扩展一个类的功能,或给一个类添加附加职责。
    2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
    3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
    4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
     
    装饰者模式实现步骤:
    1、在装饰者类中维护一个被装饰者的对象。
    2、装饰者类都继承相同的类或实现相同的接口(一般为被装饰者对象)。
      注意:拥有共同的父类,这些装饰类就可以构成一个装饰链从而达到相互装饰的效果。
     
    代码示例:
     1 interface Work{
     2     
     3     public void work();
     4 }
     5 
     6 class Son implements Work{
     7     @Override
     8     public void work() {
     9         System.out.println("画画...");
    10     }
    11 }
    12 
    13 class Mather implements Work{
    14 
    15     //需要被增强的类。
    16     Work worker;
    17     
    18     public Mather(Work worker){
    19         this.worker = worker;
    20     }
    21     
    22     @Override
    23     public void work() {
    24         worker.work();
    25         System.out.println("给画上颜色..");
    26     }
    27 }
    28 
    29 
    30 class Father implements Work{
    31 
    32     //需要被增强的类的引用
    33     Work worker;
    34     public Father(Work worker){
    35         this.worker = worker;
    36     }
    37     
    38     @Override
    39     public void work() {
    40         worker.work();
    41         System.out.println("上画框...");
    42     }
    43 }
    44 
    45 
    46 public class Demo3 {
    47     
    48     public static void main(String[] args) {
    49         Son s = new Son();
    50 //        s.work();
    51         Mather m = new Mather(s);
    52 //        m.work();
    53         Father f = new Father(m);
    54         f.work();
    55     }
    56 }
    View Code

    装饰者模式和继承都可以扩展原有类的功能。那么两者有什么优缺点呢:

    继承实现的增强类:

           优点:代码结构清晰,而且实现简单

           缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。

    修饰模式实现的增强类:

           优点:内部可以通过多态技术对多个需要增强的类进行增强

           缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。

  • 相关阅读:
    如何重启apache2服务
    ubuntu设置不睡眠的方法
    linux环境下安装varnish
    PHP 开发者该知道的 5 个 Composer 小技巧
    dl, dt, dd /line-height /loat /vertical-align 问题
    针对老式浏览器(主要是IE6、7、8)的css3-mediaqueries.js自适应布局
    三栏网页宽度自适应布局方法
    vue.js开发环境搭建
    vue.js之个人总结
    less学习:基础语法总结
  • 原文地址:https://www.cnblogs.com/nicker/p/6250313.html
Copyright © 2011-2022 走看看