一个故事教你设计模式

 

*******************************转载(忘了从那里粘来的,对不住作者了...)*****************************


小明想买一台新电脑,于是他来到了武昌的街道口电脑城的一家卖组装电脑的店里。店里的员工小张热情的招待了他,给了小明一张报价单。上面有各种电脑的配件。清单如下:
 


CPU

abstract class CPU
    {
    }

   
class AMD : CPU
    {
       
public override string ToString()
        {
           
return "AMD";
        }
    }

   
class IntelCore2 : CPU
    {
       
public override string ToString()
        {
           
return "InterCore2";
        }
    }



显示器

abstract class Display
    {
    }

   
class GreatWall : Display
    {
       
public override string ToString()
        {
           
return "GreatWall";
        }
    }

   
class LG : Display
    {
       
public override string ToString()
        {
           
return "LG";
        }
    }



主板

abstract class MainBoard
    {
    }

   
class ASUS : MainBoard
    {
       
public override string ToString()
        {
           
return "ASUS";
        }
    }

   
class Colorful : MainBoard
    {
       
public override string ToString()
        {
           
return "Colorful";
        }
    }



显卡

abstract class VideoCard
    {


    }

   
class MSI : VideoCard
    {
       
public override string ToString()
        {
           
return "MSI";
        }
    }

   
class Onda : VideoCard
    {
       
public override string ToString()
        {
           
return "Onda";
        }
    }




PC

class
PC
    {
       
private
CPU cpu;
       
private
MainBoard mainBoard;
       
private
VideoCard videoCard;
       
private
Display display;

       
public
CPU CPU
        {
           
get { return
cpu; }
           
set
{ cpu = value; }
        }
       
public
MainBoard MainBoard
        {
           
get { return
mainBoard; }
           
set
{ mainBoard = value; }
        }
       
public
VideoCard VideoCard
        {
           
get { return
videoCard; }
           
set
{ videoCard = value; }
        }
       
public
Display Display
        {
           
get { return
display; }
           
set
{ display = value; }
        }

       
public void
ShowPC()
        {
            Console.WriteLine(
" ---------------------------"
);
            Console.WriteLine(
"PC parts: "
);
            Console.WriteLine(
"CPU : "
+ cpu);
            Console.WriteLine(
"MainBoard : "
+ mainBoard);
            Console.WriteLine(
"VideoCard : "
+ videoCard);
            Console.WriteLine(
"Display : "
+ display);
        }
    }



   
小明摸摸了自己的荷包,心里想:咱没多少钱,只能配个能进行文字处理的电脑凑合着用吧,总比没电脑用强吧。于是对小张说,我CPUAMD单核的,主版要七彩虹的,显卡要昂达的,显示器要长城的。小张一听,小声滴估: 怎么什么都选最差的啊,这利润也太低了,没办法,谁叫我碰到个穷小子呢。就给他配吧,于是就是开始了配机器:
   



static void Main(string[] args)
        {
            PC pc =
new PC();
            pc.CPU =
new IntelCore2();
            pc.MainBoard =
new ASUS();
            pc.VideoCard =
new Onda();
            pc.Display =
new GreatWall();
            pc.ShowPC();
        }



    这时候小明突然看到店里的员工小黄正在玩一款很画面很绚丽的游戏,于是他问小黄:这是什么游戏啊。 小黄说:这是魔兽世界。小明被这款游戏吸引住了,于是问正在装机的小张:”我这配置能玩嘛。小张说:”玩是玩的了,不过你要玩肯定很卡。小明又看了看游戏,咽了咽口水,对小张说:”我豁出去了,我要玩这款游戏,我要改电脑配置,CPUInter双核的,主版选华硕的,显卡要微星的,显示器要LG.顺便说一句,我刷信用卡。小张心里想:这下有钱赚了。于是决定重新装机,可是一看代码,傻眼了,几乎所有的代码都需要改动,万一以后客户的需求又改动了怎么办,不过这可难不倒聪明的小张.他开始了分析其中的环节:
     
自己:负责装机器的,定义了装机的步骤. 比较稳定的部分.
      电脑配置单里面有客户选的关于电脑的各个部件。 是经常发生变化的部分.
     
电脑:要完成的产品.
     
小张决定开始重构,对于变化的部分,封装变化,用抽象类来处理电脑配置单.


电脑配置单
abstract class PcElementList
    {
       
private PC pc = new
PC();
       
public
PC PC
        {
           
get

            {
               
return pc;
            }
           
set

            {
                pc = value;
            }
        }

       
abstract public void BuildCPU();
       
abstract public void
BuildMainBoard();
       
abstract public void
BuildVideoCard();
       
abstract
        public void
BuildDisplay();
    }


 


文档处理的电脑
   
class DocumentElmentList : PcElementList
    {
       
public override void
BuildCPU()
        {
            PC.CPU =
new
AMD();
        }

       
public override void
BuildMainBoard()
        {
            PC.MainBoard =
new
Colorful();
        }

       
public override void
BuildVideoCard()
        {
            PC.VideoCard =
new
Onda();
        }

       
public override void
BuildDisplay()
        {
            PC.Display =
new
GreatWall();
        }
    }



玩游戏的电脑
   
class GameElementList : PcElementList
    {
       
public override void
BuildCPU()
        {
            PC.CPU =
new
IntelCore2();
        }

       
public override void
BuildMainBoard()
        {
            PC.MainBoard =
new
ASUS();
        }

       
public override void
BuildVideoCard()
        {
            PC.VideoCard =
new
MSI();
        }

       
public override void
BuildDisplay()
        {
            PC.Display =
new
LG();
        }
    }



     
当自己接受到一个电脑配置单就可以根据固定的步骤来组装电脑
     



class
Employee
    {
       
public void
BuildPC(PcElementList builder)
        {
            builder.BuildCPU();
            builder.BuildMainBoard();
            builder.BuildVideoCard();
            builder.BuildDisplay();
        }
    }



     
客户程序改写为:
 


    class Program
    {
       
static void Main(string[] args)
        {
            Employee xiaoZhang =
new Employee();
            PcElementList builder =
new DocumentElementList();
            xiaoZhang.BuildPC(builder);
            builder.PC.ShowPC();
        }
    }



   
如果客户想换电脑配置,把 DocumentElementList 换成 GameElementList 就可以了.这下问题解决了,小张高兴的对小明说,以后星际争霸2出来了 , 如果你要升级电脑,我可以最快速度给你配起来.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值