目录
一、代理模式
为其他对象提供一种代理以控制对这个对象的访问。
本质是控制对象访问。
代理模式一点理解:假如有两个对象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());
}
}
}