小故事学设计模式之Decorate: (二)老婆的新衣服

老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆。 但是在软件里就不一定了, 如果把老婆比作一个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: (二)老婆的新衣服,布布扣,bubuko.com

时间: 2024-10-09 02:37:07

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

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

(IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便还能跟同行们交流一下)  要和老婆一起回老家了, 成都离我们安徽太远, 两个人飞一下过去就要花掉近三千块, 于是我们决定找找有没有更便宜的机票, "你帮我找找吧, 如果找到的话,跟我说一下",我说道. "行!"老婆记住了这事. 很快我得到通知, 南航有更便宜的, 580块. 这是一个简单的observer模式. 什么是observer? 其定义如下: The Observer Pa

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

IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便跟同行们学习交流一下)前几天出去拍照,饿到腿软, 回城附近有一家永和豆浆店, 我们决定去那边解决午餐.豆浆店里面还不错, 整得挺时尚的, (跟我几年前在杭州去的那家区别蛮大).我喜欢餐馆里明亮的色调和鲜翠欲滴的菜品照片.服务员也不错, 挺和气的.邻桌饭菜的香气弥漫开来,像卡通片一样飘过来, 罩着点菜的我们俩和面前可爱的服务员(三个大头娃娃!).服务员熟练地询问,打字, 然后把小票传给后面厨房的小窗里. 一回头又面

【一起学设计模式】中介者模式+观察者模式+备忘录模式实战:(二)提交个订单我到底经历了什么鬼?

前言 再多的话就不说了,这个是接着上一讲: [一起学设计模式]状态模式+装饰器模式+简单工厂模式实战:(一)提交个订单我到底经历了什么鬼? 一起的,一些多余的赘述请先看这个篇文章. 业务场景 一图流,还是上一篇文章中一样的图,接下来我们就梳理下总结模式.观察者模式.备忘录模式的应用: 订单中心: 1.订单中心创建订单 2.订单状态流转(状态模式) 3.记录操作日志(装饰器模式+简单工厂模式) 4.订单中心通知 库存中心更新库存 调度中心: 1.库存中心更新本地库存(使用命令模式+模板方法模式+工

70个晨会激励哲理小故事

  1.面对生命的态度  有位太太请了个油漆匠到家里粉刷墙壁.  油漆匠一走进门,看到她的丈夫双目失明,顿时流露出怜悯的眼光.可是男主人一向开朗乐观,所以油漆匠在那里工作了几天,他们谈得很投机:油漆匠也从未提起男主人的缺憾.  工作完毕,油漆匠取出帐单,那位太太发现比谈妥的价钱打了一个很大的折扣.  她问油漆匠:“怎么少算这么多呢?”  油漆匠回答说:“我跟你先生在一起觉得很快乐,他对人生的态度,使我觉得自己的境况还不算最坏.所以减去的那一部分,算是我对他表示一点谢意,因为他使我不会把工作看的太

从零开始学ios开发(二):Hello World!

今天看了书的第二章,主要介绍了一下Xcode的使用方法和一些必要的说明,最后做了一个“Hello World!”的小程序,其实就是在屏幕上用一个Label显示“Hello World!”,一行代码都没有写,拖拖控件,改变一下Label字体大小颜色什么的,还是比较简单的,下面把这个过程写一下,至于xcode的使用说明就不在这里具体叙述了,反正到时候用到哪就介绍到哪里吧. 1)启动Xcode 选择“Create a new Xcode project”,创建一个新的项目. 2)模板选择,选择“Sin

圈子内小故事

咱也学学马未都先生,没有真相,只是残存一个道理. 恩,这句话还真是有点道理,那下面这些小故事就是告诉我们,在程序的世界里,行胜于言. ------------------------------------------- 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Eugene Hsueh链接:http://www.zhihu.com/question/20355709/answer/14873547来源:知乎 是的,马克·扎克伯格独自完成了 Facebook 第一

Java反射的小故事

Java反射的小故事: 首先定义一个Java类 1 package com.xiaoysec.test; 2 3 public class Person { 4 private String name; 5 private String sex; 6 private int id; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = na

关于信息化的几个小故事,摘自麦枫网

企业的信息化的实行是增强企业反响才干.进步企业效率.改进企业管理方式的一项工作,选择实施一项性能良好的信息化软件是作为信息化的主管的一项重要工作,下面我们就几个小故事来看一看: 一.指导看电脑 这是发作在几年前的一个真实的故事:某单位要添置一台电脑,向指导审批.指导以为往常是信息化时期,电脑对单位很重要的,所以很支持,就批准购进了一台电脑,由单位的小王担任日常的运用.一天,指导忽然想看看电脑到底是怎样运用的,就到电脑前面去观摩小王的操作.谁知道刚一看桌面指导居然发现一个严重的问题:"小王啊,你怎

设计模式(十二)外观模式(结构型)

概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?  解决方案