代理模式

目录

一、代理模式

二、代理模式角色

三、代码实例一

四、代码实例二

五、代码实例三

UML图:


一、代理模式

为其他对象提供一种代理以控制对这个对象的访问。

本质是控制对象访问。

代理模式一点理解:假如有两个对象A、B、C,当A不想或很难直接访问C,这时通过B访问C。

就像假如A不想去上课,然后想B帮忙答到,这时B就帮忙答到了。

程序经常应用在:

1、程序不希望用户直接访问实际对象,而是通过一个特殊的对象来控制对这个对象的访问。

2、一个对象需要很长时间加载完成。

3、对象位于远程主机上,需要为用户提供访问远程对象的能力。

二、代理模式角色

代理模式主要包括三个部分:

1、抽象主题类,声明了真实主题与代理主题的共同接口,这样代理主题就可以替换真实主题

2、被代理类,就是真实主题。

3、代理类,含有对真实主题的引用,可以操纵主题对象。

三、代码实例一

B帮A利用课堂派答到

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyTwo
{
    interface Present
    {
        void answer();
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyTwo
{
    class Teacher
    {
        private string name;

        public Teacher(string name)
        {
            this.name = name;
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyTwo
{
    class MrA:Present
    {
        Teacher teacher;

        public MrA(Teacher teacher)
        {
            this.teacher = teacher;
        }

        public void answer()
        {
            Console.WriteLine(teacher .Name +"我到了!");
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyTwo
{
    class ProxyB:Present 
    {
        MrA stuA;

        public ProxyB(Teacher A)
        {
            this.stuA = new MrA(A);
        }

        public void answer()
        {
            stuA.answer();
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyTwo
{
    class Program
    {
        static void Main(string[] args)
        {
            Teacher Z = new Teacher("Z老师");
            ProxyB Dl = new ProxyB(Z);
            Dl.answer();
        }
    }
}

四、代码实例二

然后接着是一个订单系统代码实例

订单接口类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    interface IOrder
    {
        void setOrderName(string orderName,string userName);
        String getOrderName();

        void setOrderNum(string orderNum, string userName);
        String getOrderNum();

        void setOrderUser(string orderUser, string userName);
        String getOrderUser();
    }
}

订单类,继承接口 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Order : IOrder
    {
        string orderName;
        string orderNum;
        string orderUser;

        public Order(string orderName, string orderNum, string orderUser)
        {
            this.orderName = orderName;
            this.orderNum = orderNum;
            this.orderUser = orderUser;
        }

        public string getOrderName()
        {
            return orderName;
        }

        public string getOrderNum()
        {
            return orderNum;
        }

        public string getOrderUser()
        {
           return orderUser;
        }

        public void setOrderName(string oderName, string userName)
        {
            this.orderName =orderName ;
        }

        public void setOrderNum(string oderName, string userName)
        {
            this.orderNum =orderNum ;
        }

        public void setOrderUser(string oderName, string userName)
        {
            this.orderUser =orderUser ;
        }
    }
}

代理类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class OrdeProxy : IOrder
    {
        private Order order=null;

        public OrdeProxy(Order order)
        {
            this.order = order;
        }

        public string getOrderName()
        {
            return order.getOrderName();
        }

        public string getOrderNum()
        {
            return order.getOrderNum ();
        }

        public string getOrderUser()
        {
            return order.getOrderUser ();
        }

        public bool ok(string user)
        {
            if (user != null && user == order.getOrderUser())
                return true;
            return false;
        }

        public void setOrderName(string orderName, string userName)
        {
            if (ok(userName))
            {
                order.setOrderName(orderName, userName);
            }
            else
            {
                Console.WriteLine("非法操作!");
            }
        }

        public void setOrderNum(string orderNum, string userName)
        {
            if (ok(userName))
            {
                order.setOrderNum(orderNum, userName);
            }
            else
            {
                Console.WriteLine("非法操作!");
            }
        }

        public void setOrderUser(string orderUser, string userName)
        {
            if (ok(userName))
            {
                order.setOrderUser(orderUser, userName);
            }
            else
            {
                Console.WriteLine("非法操作!");
            }
        }
    }
}

客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            IOrder order = new OrdeProxy(new Order("设计模式","100", "小李"));
            order.setOrderNum("100", "小吴");
            order.setOrderNum("106", "小李");
        }
    }
}

五、代码实例三

游戏代练

 抽象主题接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyOne
{
    interface  IGamePlayer
    {
        void KillBoss();
        void UpGrade();
    }
}

真实主题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyOne
{
    class GamePlayer : IGamePlayer
    {
        private string name;

        public GamePlayer(string name)
        {
            this.name = name;
        }

        public void KillBoss()
        {
            Console.WriteLine(this.name+"在打怪");
        }

        public void UpGrade()
        {
            Console.WriteLine(this.name + "成功升级");
        }
    }
}

代理主题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProxyOne
{
    class GamePlayerProxy : IGamePlayer
    {
        private IGamePlayer player = null;

        public GamePlayerProxy(IGamePlayer player)
        {
            this.player = player;
        }
        public void Log()
        {
            Console.WriteLine("打怪时间:" + new DateTime().ToLongDateString());
        }
        public void KillBoss()
        {
            this.Log();
            player.KillBoss();
        }

        public void UpGrade()
        {
            this.Count();
            player.UpGrade();
        }
        public void Count()
        {
            Console.WriteLine("打怪花费2小时");
        }
    }
}

测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProxyOne
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            IGamePlayer player = new GamePlayer("小明");
            IGamePlayer proxy = new GamePlayerProxy(player);
            proxy.KillBoss();
            proxy.UpGrade();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

 

UML图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值