c#面向对象23种设计模式——"代理模式"

187 阅读2分钟

一:概述

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

二、举例说明

1、我有一个游戏接口(Game),用公共的手机功能类(Phone)去继承实现游戏接口。

2、现在我业务中实例一个老年手机类(OldManPhone)也继承手机功能并且老年手机的游戏功能就是手机功能公共类实现的游戏功能。

3、我有一个新业务,实现一个智能手机(HuaWeiPhone),他的主体业务是玩游戏,所以他也去实现游戏接口,但是他是智能手机,所以会有一些自己的新功能,在自己实现的游戏方法中添加新业务,所以不会影响到主体(Phone)的游戏业务逻辑,不会影响到别人使用(Phone)的游戏方法,这就是代理模式!!!

三、代码演示

源码如下:

//这是一个游戏接口
public interface GameInterface
{
    void Game();
}

/// <summary>
/// 公共手机功能类
/// </summary>
public class Phone : GameInterface
{
    public void Game()
    {
        Console.WriteLine("玩游戏");
    }
}

/// <summary>
/// 老年手机
/// </summary>
public class OldManPhone : Phone
{
    /// <summary>
    /// 老年手机只调用了 手机父类的游戏方法,
    /// 因为老年手机只有一个游戏
    /// 没有任何其他功能
    /// </summary>
    public void Game()
    {
        Phone phone = new Phone();  
        phone.Game();
    }
}

/// <summary>
/// 智能手机类
/// </summary>
public  class HuaWeiPhone: GameInterface
{
    //代理模式: 通过代理完成对主体业务逻辑的访问
    //包一层以便于扩展自己的业务,并且不影响主题业务

    /// <summary>
    /// 组合
    /// </summary>
    private GameInterface game = new Phone();
    public void Game()
    {
        //处理华为手机玩游戏的业务
        //比如: 先打开流量,不然玩不了
        Console.WriteLine("先打开数据连接");

        game.Game();

        Console.WriteLine("玩完了,关闭数据连接");
    }

}

四、代理模式的效果

方法调用:

     // GET: api/<ProxyController>
    [HttpGet]
    public IEnumerable<string> Get()
    {
        HuaWeiPhone phone = new HuaWeiPhone();
        Console.WriteLine("华为手机玩游戏的方法: ");
        phone.Game();
        Console.WriteLine();

        OldManPhone oldManPhone = new OldManPhone();
        Console.WriteLine("老年手机玩游戏的方法: ");
        oldManPhone.Game();
        Console.WriteLine();

        return new string[] { "value1", "value2" };
    }

我这里写了一个接口去实现上方智能手机,和老年手机。

image.png 如图所示: 我们新加的智能手机类的游戏方法添加到新业务并不会影响到系统中其他的功能!!!

以上就是我们c#面向对象23种设计模式之——"代理模式"的简单应用,大家还有更好的应用方法,欢迎到评论区讨论!!!