zoukankan      html  css  js  c++  java
  • 设计模式(二)__装饰设计模式

    今天呢,来给大家介绍一下装饰设计模式,java中IO就使用到了这个模式。

      装饰设计模式,顾名思义,就是对一个功能进行装饰,就跟女人化妆一样,人还是本人,但是化了妆就变得比原来更漂亮了。

      需求:当你有个功能是在N年前建立的,如今老大觉得功能不够用了,需要进行增强,那么怎么办呢?

      解决:你就可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。如果这个功能写错了,又可以把自己写的功能去掉而不影响以前的功能,是不是很灵活啊。这个类就是装饰类。

      装饰设计模式呢,主要是对一组类进行功能的增强

      那么什么时候会用到装饰模式呢?

      1.需要扩展一个类的功能,或给一个类增加附加责任

      2.需要动态的给一个对象增加功能,这些功能可以再动态的撤销

      3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实

    好了,上菜了。

    (由于本人比较笨,想不出什么比较恰当的例子,这里就借鉴一下http://blog.csdn.net/furongkang/article/details/7214100中的例子。什么?你说我懒? 哼,好吧,我承认我懒。)

     1 /*
     2  
     3 我家里有两套房子:平房,楼房。
     4 
     5 House
     6     |--PingFang
     7     |--LouFang
     8 
     9 可是像我这么土豪,又具有强烈的文艺范,又有众多妻妾。。。 相信你已经感觉到了我的霸王之气。
    10 所以:
    11     1,对平房进行田园风光式的打造。
    12     2,对楼房进行欧式风格的打造。
    13 可以通过继承的方式来完成。
    14 
    15 House
    16     |--PingFang
    17         |--TianYuanPingFang
    18     |--LouFang
    19         |--OuShiLouFang
    20 
    21  */
    22 abstract class House {
    23     abstract void show();
    24 }
    25 
    26 class PingFang extends House {
    27     public void show() {
    28         System.out.println("平房");
    29     }
    30 }
    31 
    32 class TianYuanPingFang extends PingFang {
    33     public void showTianYuan() {
    34         super.show();
    35         System.out.println("田园风格");
    36     }
    37 }
    38 
    39 class LouFang extends House {
    40     public void show() {
    41         System.out.println("楼房");
    42     }
    43 }
    44 
    45 class OuShiLouFang extends LouFang {
    46     public void showOuShi() {
    47         super.show();
    48         System.out.println("欧式风格");
    49     }
    50 }
    51 
    52 class HouseDemo {
    53     public static void main(String[] args) {
    54         PingFang p = new PingFang();
    55         // p.show();
    56 
    57         TianYuanPingFang t = new TianYuanPingFang();
    58         t.showTianYuan();
    59 
    60         LouFang l = new LouFang();
    61         // l.show();
    62         OuShiLouFang o = new OuShiLouFang();
    63         o.showOuShi();
    64     }
    65 }

      上面的代码实现了我需要的功能,但是如果单单为了某个功能而去继承,那么那个体系是非常臃肿的。你说感觉不出来?假如你有几百个类,那么就会需要再写上几百个子类去继承。能累死个人。

      装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。

      装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

    使用装饰设计模式进行装饰:

     1 /*
     2 原体系:
     3 House
     4     |--PingFang
     5     |--LouFang
     6     
     7 通过继承之后的体系
     8 House 
     9     |--PingFang 
    10         |--TianYuanPingFang 
    11     |--LouFang 
    12         |--OuShiLouFang 
    13         
    14 无论将平房打造成田园还是欧式,都是对平房一种装修。
    15 而该装修也可以用楼房。
    16 
    17 将现将该装修定义好,需要把什么房子进行改装修,传入即可。
    18 House
    19     |--PingFang
    20     |--LouFang
    21     |--TianYuan
    22     |--OuShi
    23 
    24  */
    25 abstract class House {
    26     abstract void show();
    27 }
    28 
    29 class PingFang extends House {
    30     public void show() {
    31         System.out.println("平房");
    32     }
    33 }
    34 
    35 class LouFang extends House {
    36     public void show() {
    37         System.out.println("楼房");
    38     }
    39 }
    40 
    41 class TianYuan extends House {
    42 
    43     private House h;
    44 
    45     TianYuan(House h) {
    46         this.h = h;
    47     }
    48 
    49     public void show() {
    50         System.out.println("田园风格");
    51     }
    52 
    53     public void showTianYuan() {
    54         h.show();
    55         this.show();
    56     }
    57 
    58 }
    59 
    60 class OuShi extends House {
    61     private House h;
    62 
    63     OuShi(House h) {
    64         this.h = h;
    65     }
    66 
    67     public void show() {
    68         System.out.println("欧式风格");
    69     }
    70 
    71     public void showOuShi() {
    72         h.show();
    73         this.show();
    74     }
    75 
    76 }
    77 
    78 class HouseDemo2 {
    79     public static void main(String[] args) {
    80         PingFang p = new PingFang();
    81         LouFang l = new LouFang();
    82 
    83         OuShi o = new OuShi(new TianYuan(p));
    84         o.showOuShi();
    85 
    86         // TianYuan t = new TianYuan(l);
    87         // t.showTianYuan();
    88 
    89         // OuShi o = new OuShi(l);
    90         // o.showOuShi();
    91     }
    92 }

    是不是好了很多呢。

  • 相关阅读:
    通过串口抓取图片
    Qt也有垃圾回收(通过QScopedPointer实现),下决心在项目里使用QScopedPointer,省了太多事情了,而且更安全!!
    IOS端 margin-top 和 margin-bottom 使用负数时的区别
    使用ROME解析rss,如何获取icon图标
    SVG图片如何调整大小和颜色
    Js点击触发Css3的动画Animations、过渡Transitions效果
    如何判断是否为同一个App,Ionic3如何修改包名
    如何使用JPQL写纯SQL语句
    为何在新线程中使用注解获取不到Spring管理的Bean
    Ionic的NavController 和ModalController 的区别
  • 原文地址:https://www.cnblogs.com/makaruila/p/4851683.html
Copyright © 2011-2022 走看看