老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆。 但是在软件里就不一定了, 如果把老婆比作一个class的话, 有一种做法是会因为增加了两个新的Property而继承出两个子类:

"穿裙子的老婆, 穿粉色上衣的老婆".

你这样弄出两个子类也没什么不对, 问题是当MM的有上百件服装的时候,就会产生上百个子类,这个不好,将来万一父类一变化,下面上百个子类都要一个个地去修改,太乱了。

有一个更合理的方式来解决这个"老婆的装饰问题"。我们的要求是:
      老婆不能因为穿上了不同的衣服而从本质上改变她这个人,(逻辑上说, 不要又来一个"白马非马")。

根据按上面的要求, 我们可以写出以下的代码:


using System;
using System.Collections.Generic;
using System.Text; public class Feifei
{
private string _myclothes;
public string MyClothes
{
get{return _myclothes;}
set{_myclothes = value;}
}
} public class BlueSkirt:Feifei
{
private Feifei _f;
private StringBuilder _myclothes = new StringBuilder(); public BlueSkirt(Feifei f)
{
_f = f;
} public string MyClothes
{
get
{
_myclothes.Append(_f.MyClothes);
_myclothes.Append("and a piece of blue skirt"); return _myclothes.ToString();
}
set{;} }
} public class PinkSkirt:Feifei
{
private Feifei _f;
private StringBuilder _myclothes = new StringBuilder(); public PinkSkirt(Feifei f)
{
_f = f;
} public string MyClothes
{
get
{
_myclothes.Append(_f.MyClothes);
_myclothes.Append("and a piece of pink skirt"); return _myclothes.ToString();
}
set{;} }
} public class MyClass
{
public static void Main()
{
//老婆穿白色的鞋子出场
Feifei f1 = new Feifei();
f1.MyClothes = "I have white shoes,"; //换上蓝色的裙子
BlueSkirt f2 = new BlueSkirt(f1);
Console.WriteLine(f2.MyClothes); //换上粉色的裙子
PinkSkirt f3 = new PinkSkirt(f1);
Console.WriteLine(f3.MyClothes); Console.Read();
} }
好,我们来看一下结果。
 
以上就是Decorate模式的个人理解。
 
谢谢!

小故事学设计模式之Decorate: (二)老婆的新衣服的更多相关文章

  1. 小故事学设计模式之Observer : (三) 老婆帮忙订机票

    (IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便还能跟同行们交流一下)  要和老婆一起回老家了, 成都离我们安徽太远, 两个人飞一下过去就要花掉近三千块, 于是我 ...

  2. 小故事学设计模式之Command : (一) 在永和豆浆店

    IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便跟同行们学习交流一下)前几天出去拍照,饿到腿软, 回城附近有一家永和豆浆店, 我们决定去那边解决午餐.豆浆店里面还不 ...

  3. 前端小姐姐学PHP之(二)

    上次了我们配置好开发环境了,本小节主要讲述内容点: phpStrom的运行环境配置 创建数据库.数据表 连接数据库 一.phpStrom的运行环境配置(windows版) 注:MAC版原文地址 htt ...

  4. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  5. 从零开始单排学设计模式「装饰模式」黑铁 I

    阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

  6. 杂谈---小故事小道理,面试中的小技巧(NO.2)

    本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...

  7. 从壹开始 [ Design Pattern ] 之三 ║ 工厂模式 与 小故事

    编者按: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到子类. 工厂模式,是迄今为止,使用最多,最广泛的设计模式之一,它的身影几乎出现在每一个框架和个人代码之中 ...

  8. Java反射的小故事

    Java反射的小故事: 首先定义一个Java类 package com.xiaoysec.test; public class Person { private String name; privat ...

  9. 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...

随机推荐

  1. Pseudoprime numbers---费马小定理

    Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13406   Accepted: 5 ...

  2. 搭建Redis报错

    2018-10-26 报错信息 You need tcl 8.5 or newer in order to run the Redis test 原因 缺少 tcl 插件 解决方式 wget http ...

  3. Python+Selenium定位元素的方法

    Python+Selenium有以下八种定位元素的方法: 1. find_element_by_id() eg: find_element_by_id("kw") 2. find_ ...

  4. 20条IPTables防火墙规则用法! [转]

    20条IPTables防火墙规则用法! 导读 管理网络流量是系统管理员必需处理的最棘手工作之一,我们必需规定连接系统的用户满足防火墙的传入和传出要求,以最大限度保证系统免受攻击.很多用户把 Linux ...

  5. bind-named

    main-book: http://www.zytrax.com/books/dns resolv.conf: http://dns-learning.twnic.net.tw/bind/intro4 ...

  6. 第一章:hybrid app开发之技术选型

    伴随着移动互联网的兴起,越来越多的企业将部分资源投入其中,想在互联网+的大潮中分一杯羹,并期望着站在风口上,成为时代的弄潮儿. 现在不会做一个app都不好意思说是搞互联网的,那么开发一个app的方式有 ...

  7. Column 'orders' in order clause is ambiguous

    今天报了这个错误 原因是.当使用sql查询语句,使用了join查表.但是这个orders没指定是哪张表的字段 ,发生在自关联情况

  8. Android多语言与国际化

    internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n.一般用 语言_地区的形式表示一种语言,如 zh_ ...

  9. 网页设计,Access入门 2010,语文

    Access入门 2010(select查询) order by(按升序排列)?+desc(按降序排列) group by(进行分组,下一行只能用having) sum(数值总数)?+as?(新字段的 ...

  10. concat、concat_ws、group_concat函数用法

    一.concat()函数可以连接一个或者多个字符串 CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. select conc ...