设计模式 - 代理、外观(2)

 

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) 小李不用东奔西走地直接去办各种麻烦的手续了。

   例. 故事的实现:

using System;

// 子系统 - 财务部
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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值