首页新闻招聘找找看知识库
  • 回复:11 浏览:5259 2007-11-16 15:05 来自 彭成刚

    相信大部分人都听过 马三立的相声吧。。 还记得 “挠挠” 这个词吗。。呵呵。。

    有个人有个毛病,晚上一睡觉就浑身痒,忽然看见路边有卖家传秘方,这个人买回来。。
    晚上的时候,忽然痒了起来,这人拿起了秘方,打开了一层又一层,经过30多层后,最后出现了秘方 “挠挠”。。嘎嘎

    让我来用这个秘方来引出我们今天的主角吧。。 装饰者模式 (众人叫好,挠挠来拉。。o(∩_∩)o...哈哈)

    让我们用 装饰者来 制作这个 秘方 吧。

    首先来分析下我们要用到的道具,可以分为两个,一个是 秘方本体(比如“挠挠”是一个,“蹭墙”又属于一个,等等。。) 还有就是包装纸(比如 厕纸 红色的A4纸 报纸 等等),之后就是拿出一个秘方本体,再用包装纸(随意选配)包它个30层,我们的秘方就可以到马路上去卖了。。嘎嘎。。(被人打别来找我,概不负责!)

    啊。。忘了意见很重要的事情,那就是忘了核算成本了,别你上马路的时候给卖赔本了。。那个可就得不常失了。。
    给我们的纸 要定个价格。。随后算算成本是多钱啊。。你再卖的时候不就有跟了吗。。咱们也是有成本的啊。。对否。。嘎嘎

    ----------------------------------------------
    public abstract class mifang
     {
      public string biaoti = "未标题";

      public abstract string getBiaoti();

      public abstract double jiage();
     }

     public abstract class baozhuang : mifang
     {
      //public abstract string getBiaoti();
     }
     //基类已经做好,现在让我们来做 秘方的核心东东把,做个秘方 挠挠

     public class naonao : mifang
     {
      public naonao()
      {
       biaoti = "挠挠";
      }

      public override string getBiaoti()
      {
       return biaoti;
      }
      public override double jiage()
      {
       return 1.99;
      }
     }

     //开始做纸吧。。
     
     public class baozhi : baozhuang
     {
      mifang mifang;
      public baozhi(mifang mifang)
      {
       this.mifang = mifang;
      }

      public override string getBiaoti()
      {
       return mifang.getBiaoti() +  ", 报纸";
      }

      public override double jiage()
      {
       return 0.2 + mifang.jiage();
      }
     }

     public class hongzhi : baozhuang
     {
      mifang mifang;
      public hongzhi(mifang mifang)
      {
       this.mifang = mifang;
      }

      public override string getBiaoti()
      {
       return mifang.getBiaoti() + ", 红纸";
      }

      public override double jiage()
      {
       return 0.8 + mifang.jiage();
      }
     }
    --------------------------------------

       mifang naonao = new naonao();
       naonao = new hongzhi(naonao);
       naonao = new baozhi(naonao);
       naonao = new hongzhi(naonao);
       naonao = new baozhi(naonao);
       this.Page.Response.Write( "biaoti:" + naonao.getBiaoti()+ " jiage:"

    +naonao.jiage().ToString());
    -------------------------------------

    输出结果:

    biaoti:挠挠, 红纸, 报纸, 红纸, 报纸 jiage:3.99

    -------------------------------------

    给个小程式。。嘎嘎。。
     public class a
     {
      public string str = "none";
      public virtual string kk()
      {
       return str;
      }
     }
     public class b : a
     {
      public b()
      {
       str = "have";
      }
      public override string kk()
      {
       return str;
      }
     }
     public class c : a
     {
      a a;
      public c(a a)
      {
       this.a = a;
      }
      public override string kk()
      {
       return this.a.str + ",cc";
      }
     }
    --------------------------
    程序:
       a b = new b();
       this.Page.Response.Write(b.kk());
       b = new c(b);
       this.Page.Response.Write(b.kk());
    --------------------------
    结果:have have,cc
    --------------------------


    在总结个小经验
    在基类中 用的 public string kk() 的话,子类继承后 用 public new string kk() 覆盖基类后,
    基类调用kk方法时用的是基类的kk()
    在基类中 用的 public virtual string kk() 的话, 子类继承后 用 public override string kk() 后覆盖基类后,基类调用的是最后覆盖的kk()

    哇嘎嘎。。又会一招。。吼吼。。

    今天忙和一天。。这个破装饰者。。本来看着书抄不是很难,结果由java转.net的时候出现了很多问题。。(啊。。说露馅了。。555 呵呵) 怎么说今天是学习了一些新知识。。大家继续共同努力吧!!


     

  • Wilensky
    2007-11-16 15:09 Wilensky
    刚子真有一套,赞一个,呵呵
    第1楼 回到顶楼
  • 彭成刚
    2007-11-16 15:15 彭成刚
    就 虚拟(virtual)函数 和 抽象(abstract)函数 来说的话,虚拟就是有个默认值吧。。 抽象就没有默认值。。倒是都能override,但是抽象是必须override,而虚拟函数由于有默认函数了,所以就不用一定override了啊。。以上是我猜的。不知道对不对。。嘎嘎。。
    第2楼 回到顶楼
  • 伍迷
    2007-11-16 15:16 伍迷
    每天努力进步一点点,未来成就就不是一点点。加油,朋友。
    第3楼 回到顶楼
  • shengnet
    2007-11-16 15:23 shengnet
    哈哈,我是钢丝!
    第4楼 回到顶楼
  • pillow
    2009-01-02 01:41 pillow
    对装饰者模式理解的真好.不过对我有启迪的倒是
    mifang naonao = new naonao();
    naonao = new hongzhi(naonao);
    naonao = new baozhi(naonao);
    naonao = new hongzhi(naonao);
    naonao = new baozhi(naonao);
    这段代码.我都不知道这样可以迭代.多学了
    第5楼 回到顶楼
  • 包建强
    2009-01-02 11:48 包建强
    嗯,"逗你玩"是代理模式.
    第6楼 回到顶楼
  • 包建强
    2009-01-02 11:49 包建强
    "扔靴子"是异步调用中的等待直至完成
    第7楼 回到顶楼
  • 陈泽富
    2009-01-07 10:08 陈泽富

    郁闷看得头大,能不能写规范点
    第8楼 回到顶楼
  • dachuan
    2009-01-08 18:47 dachuan
    good !
    第9楼 回到顶楼
  • Belly Guo
    2014-07-31 10:47 Belly Guo
    我觉得去理解装饰者模式,直接去看JAVA的IO就可以了。完全一个装饰者。看着JAVA源码和装饰者的UML图。一下就明白了。
    第10楼 回到顶楼
  • 嗜血狂魔123
    2015-04-29 22:55 嗜血狂魔123
    [福利]北风网面值200元学习卡免费领取 送千G IT视频资料 各位学IT的同学,朋友,大福利来啦,北风网面值200元学习卡现在免费领取啦,数量有限,欲领从速,数量有限哦... 现北风网隆重退出大量 Hadoop,asp,php ,orcal 数据库 .net 嵌入式,java开发,web前端,VC++,Hive云计算等 新IT视频教学资料,以及一些基础的办公软件,ps,平面设计等精美资源只要是和计算机有关的在这里都能找到。凡是2015年新用户均有优惠,而且还有价值200元的学习卡免费领取,可以抵消价值200元的任何一套视频教程,数量有限,欲领从速。 http://www.ibeifeng.com/learncard.php?adm=1503094
    第11楼 回到顶楼
登录后才能评论,请先登录注册