1. 代理模式(Proxy) - 你做事情,我拿功
故事:经理有任务总是交给Jim主管,而Jim主管从来就是把这些事情交给他的下属来做。经理看到Jim成绩显著,请Jim请客美美地吃了一顿,当然Jim主管的升迁机会也是大大的有。真是你做事情,我拿功啊!
思路:经理叫Jim做的事情与Jim叫下属做的事情是一样的,不同的是,经理交给Jim的任务实际上是他的下属完成的,而Jim交给下属的任务是由下属们亲自完成的。因此,在这种模式中,Jim和下属都是为了完成相同的任务,只是方式不同。于是,我们将各个任务抽象出来,放入一个接口或抽象类中。Jim和他的下属都实现这个接口中的方法,或改写抽象类中的方法。Jim的任务由下属完成,因些他维护某个下属。经理看到Jim执行任务的时候,Jim则在叫他的下属来做。
方法:(1) 接口或抽象类表示一系列任务(Jim主管和下属要完成的任务)。
(2) 代理对象(Jim)和实际对象(下属)都实现同一接口(以不同的方式完成同一任务),或重写抽象类中的抽象方法。
(3) 客户端(相当于本例中的经理)看到的是代理对象的方法,看不到实际对象的方法。
例1. 故事的实现:
using System;
using System.Collections.Generic;
using System.Text;
class Manager
{
static void Main(string[] args)
{
Director Jim = new Director();
//经理把任务交给Jim主管。
Jim.RepairingABadMachine();
Jim.ParkingCarforManager();
Jim.PreparingforAMeeting();
//^_^,由于Jim主管工作做得漂亮,经理对Jim主管进行了小小的奖励
Console.WriteLine("Jim, 今天晚上我请客!");
Console.Read();
}
}
interface Task //主管和下属完成同样的任务
{
void RepairingABadMachine();
void ParkingCarforManager();
void PreparingforAMeeting();
}
class Employee : Task
{
//可怜的下属
public void RepairingABadMachine()
{
Console.WriteLine("正在维修机器。。。。。。。");
}
public void ParkingCarforManager()
{
Console.WriteLine("正在帮经理停车。。。。。。");
}
public void PreparingforAMeeting()
{
Console.WriteLine("正在准备开会。。。。。。。");
}
}
class Director : Task
{
//狡猾的主管叫下属替他做一切事情,而把功劳归于自己
Employee emp = new Employee();
public void RepairingABadMachine()
{
emp.RepairingABadMachine();
}
public void ParkingCarforManager()
{
emp.ParkingCarforManager();
}
public void PreparingforAMeeting()
{
emp.PreparingforAMeeting();
}
}
例2. 女人统治世界
这世界一分为二,一半是男人,一半是女人。有人说:“男人统治世界,女人统治男人。”这是一个三段论,结果还是女人统治世界。来看看这个怎么实现。
using System;
class Client
{
static void Main(string[] args)
{
Woman woman = new Woman();
woman.MakingMoney();
woman.FightingAgainstEnemy();
woman.TakingCareOfChildren();
Console.Read();
}
}
interface RulingTheWorld //通过各种方式统治世界
{
void MakingMoney();
void FightingAgainstEnemy();
void TakingCareOfChildren();
}
class Man : RulingTheWorld
{
//男人统治世界
public void MakingMoney()
{
Console.WriteLine("Making money


}
public void FightingAgainstEnemy()
{
Console.WriteLine("Fighting against enemy


}
public void TakingCareOfChildren()
{
Console.WriteLine("Taking care of children


}
}
class Woman : RulingTheWorld
{
//聪明的女人通过男人统治世界
Man man;
public Woman()
{
man = new Man();
}
public void MakingMoney()
{
man.MakingMoney();
}
public void FightingAgainstEnemy()
{
man.FightingAgainstEnemy();
}
public void TakingCareOfChildren()
{
man.TakingCareOfChildren();
}
}
2. 外观模式(Facade)
故事:9月15号是小李第一次跨进大学的校门,入校手续太多,小李办了一个上午还没完。下午小李碰到迎新的师兄,这位好心的师兄听到小李的手续还没办法,答应帮小李办完其它手续。小李谢谢一番后终于可以休息了。。。。。。
方法:(1) 各种手续相当于该模式中的各个子系统
(2) 好心的师兄相当于该模式中的统一访问接口
(3) 小李不用东奔西走地直接去办各种麻烦的手续了。
例. 故事的实现:
// 子系统 - 财务部
class FinancialDepartment
{
public bool PayTuition(FreshMan f)
{
Console.WriteLine("Pay tuition for {0}", f.Name);
return true;
}
}
// 子系统 - 教学部
class TeachingDeparment
{
public bool GetTextBook(FreshMan f)
{
Console.WriteLine("Get textbook for {0}", f.Name);
return true;
}
}
// 子系统 - 体育部
class PEDepartment
{
public bool GetUniform(FreshMan f)
{
Console.WriteLine("Get uniform for {0}", f.Name);
return true;
}
}
// 入校新生
class FreshMan
{
private string name;
public FreshMan(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
// Facade统一接口 - 迎新的同学
class SeniorStudent
{
private FinancialDepartment fDepartment = new FinancialDepartment();
private TeachingDeparment tDepartment = new TeachingDeparment();
private PEDepartment peDepartment = new PEDepartment();
public bool IsFinished(FreshMan f)
{
//检查手续是否办完
if (!fDepartment.PayTuition(f))
return false;
if (!tDepartment.GetTextBook(f))
return false;
if (!peDepartment.GetUniform(f))
return false;
return true;
}
}
public class Clients
{
public static void Main(string[] args)
{
FreshMan Lisi = new FreshMan("Lisi");
SeniorStudent ZhangSan = new SeniorStudent();
ZhangSan.IsFinished(Lisi);
Console.Read();
}
}