[C#]代理模式(Proxy)和转换器模式(Adapter)

[C#]代理模式(Proxy)和转换器模式(Adapter)


前言

今天想记录一下Proxy和Adapter这两种设计模式,为何会放在一起说呢,因为这两种也是非常相像,其实我们如果不管设计模式的话,也几乎都是常常使用到的了,接下来模拟情境一下,先从proxy讲起吧。

proxy模式

假设今天我有一个所有诊所的地址数据,而这数据是从政府公开数据来的,如果不管面向对象的话,应该会直接在ap层就写了,以web form来说是aspx.cs而mvc的话就是controller,以下则是一个示例

void Main()
{
	var client=new HttpClient();
	var message=client.GetStringAsync("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=55ec6d6e-dc5c-4268-a725-d04cc262172b");
	var json=JsonConvert.DeserializeObject(message.Result);
	json.Dump();
}


public class MrtResult
{
	public Result result { get; set; }
}

public class Result
{
	public int offset { get; set; }
	public int limit { get; set; }
	public int count { get; set; }
	public string sort { get; set; }
	public Result1[] results { get; set; }
}

public class Result1
{
	public string _id { get; set; }
	public string Station { get; set; }
	public string Destination { get; set; }
	public DateTime UpdateTime { get; set; }
}

我们可以试想一下,如果政府的api只要修改了,我们这样子调用在越多地方出现,就要去四处找出来改,那我们使用proxy模式来包装一下吧

void Main()
{
	var dao=new HttpDao();
	var mrtData=dao.GetMrts();
	mrtData.Dump();
}

public class HttpDao
{
	//抽一个方法出来,以后要修改只要改这边就好了
	public MrtResult GetMrts()
	{
		var client = new HttpClient();
		var message = client.GetStringAsync("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=55ec6d6e-dc5c-4268-a725-d04cc262172b");
		return JsonConvert.DeserializeObject(message.Result);
	}
}

这样子的话,不管别人提供的api怎么改,我们只要修改抽出来的方法就可以了

adapter模式

以proxy模式来说,因为我们是使用类包装,但是假设今天mrt的数据要改成存进db,那我们就有类似的需求,但有两种实现的方式,这时候就是适合用adapter的方式了

void Main()
{
	IDao httpDao = new HttpDao();
	var mrtDataFromHttp = httpDao.GetMrts();
	mrtDataFromHttp.Dump();
	IDao dbDao = new DbDao();
	var mrtDataFromDb = dbDao.GetMrts();
	mrtDataFromDb.Dump();
}

public interface IDao //抽出一个界面
{
	MrtResult GetMrts();
}

public class DbDao : IDao //一个十Db来的
{
	public MrtResult GetMrts()
	{
		//假设这边会存回Db的数据
		return new MrtResult();
	}
}

public class HttpDao : IDao //一个是透过Http来的
{
	public MrtResult GetMrts()
	{
		var client = new HttpClient();
		var message = client.GetStringAsync("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=55ec6d6e-dc5c-4268-a725-d04cc262172b");
		return JsonConvert.DeserializeObject(message.Result);
	}
}

结论

其实这两种模式想要完成的目的都是差不多,只是一个是直接使用类,一个则是改成用界面的方式而已,如果有任何大大觉得这边的论点有任何错误的话,再请多多指导啰。