小明想买一台新电脑,于是他来到了武昌的街道口电脑城的一家卖组装电脑的店里。店里的员工小张热情的招待了他,给了小明一张报价单。上面有各种电脑的配件。清单如下:
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);
}
}
小明摸摸了自己的荷包,心里想:咱没多少钱,只能配个能进行文字处理的电脑凑合着用吧,总比没电脑用强吧。于是对小张说,我CPU选AMD单核的,主版要七彩虹的,显卡要昂达的,显示器要长城的。小张一听,小声滴估: 怎么什么都选最差的啊,这利润也太低了,没办法,谁叫我碰到个穷小子呢。就给他配吧,于是就是开始了配机器:
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();
}
这时候小明突然看到店里的员工小黄正在玩一款很画面很绚丽的游戏,于是他问小黄:这是什么游戏啊。 小黄说:这是魔兽世界。小明被这款游戏吸引住了,于是问正在装机的小张:”我这配置能玩嘛。”小张说:”玩是玩的了,不过你要玩肯定很卡” 。小明又看了看游戏,咽了咽口水,对小张说:”我豁出去了,我要玩这款游戏,我要改电脑配置,CPU选Inter双核的,主版选华硕的,显卡要微星的,显示器要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出来了 , 如果你要升级电脑,我可以最快速度给你配起来.