运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题 合理应用扬长避短
结构性设计模式:
.net设计模式 (适配器模式)学习笔记
概要: 适配器模式多用于 对现有 系统的改造 或者集成 第三方功能的时候。为贴合 自身系统 所做的改造。 对 本身系统 和 第三方功能 不做修改。只做自身系统做扩展
-
对象适配器 通过组合实现
-
类适配器 通过继承实现 强耦合,灵活度低
比方说我们 现有系统 数据库 对 Mysql, sqlsever, Oracal 都有封装, 后来需要对系统进行优化,添加了第三方的 Redis(内存数据) 来做数据的优化。 接下来 我们将用 适配器模式在不修改原有代码的。 情况下 用适配器模式 扩展出对 Redis 的支持!
/// <summary>
/// 原有 数据访问接口
/// </summary>
public interface IHelper
{
void Add<T>();
void Delete<T>();
void Update<T>();
void Query<T>();
}
//原有对mysql 的支持
public class MysqlHelper : IHelper
{
public void Add<T>()
{
Console.WriteLine("This is {0} Add", this.GetType().Name);
}
public void Delete<T>()
{
Console.WriteLine("This is {0} Delete", this.GetType().Name);
}
public void Query<T>()
{
Console.WriteLine("This is {0} Query", this.GetType().Name);
}
public void Update<T>()
{
Console.WriteLine("This is {0} Update", this.GetType().Name);
}
}
//原有对Orical 的支持
public class OraclHelper : IHelper
{
public void Add<T>()
{
Console.WriteLine("This is {0} Add", this.GetType().Name);
}
public void Delete<T>()
{
Console.WriteLine("This is {0} Delete", this.GetType().Name);
}
public void Query<T>()
{
Console.WriteLine("This is {0} Query", this.GetType().Name);
}
public void Update<T>()
{
Console.WriteLine("This is {0} Update", this.GetType().Name);
}
}
//原有对 Sqlserver 的支持
public class SqlserverHelper : IHelper
{
public void Add<T>()
{
Console.WriteLine("This is {0} Add",this.GetType().Name);
}
public void Delete<T>()
{
Console.WriteLine("This is {0} Delete", this.GetType().Name);
}
public void Query<T>()
{
Console.WriteLine("This is {0} Query", this.GetType().Name);
}
public void Update<T>()
{
Console.WriteLine("This is {0} Update", this.GetType().Name);
}
}
/// <summary>
/// 为优化效率 第三方 提供 新添新的功能
/// </summary>
public class RedisHelpercs
{
public void AddRedis<T>()
{
Console.WriteLine("This is {0} Add", this.GetType().Name);
}
public void DeleteRedis<T>()
{
Console.WriteLine("This is {0} Delete", this.GetType().Name);
}
public void UpdateRedis<T>()
{
Console.WriteLine("This is {0} Update", this.GetType().Name);
}
public void QueryRedis<T>()
{
Console.WriteLine("This is {0} Query", this.GetType().Name);
}
}
/// <summary>
/// 类适配器
/// </summary>
public class RedisHelpercsClassAdpater : RedisHelpercs, IHelper
{
void IHelper.Add<T>()
{
base.AddRedis<T>();
}
void IHelper.Delete<T>()
{
base.DeleteRedis<T>();
}
void IHelper.Query<T>()
{
base.QueryRedis<T>();
}
void IHelper.Update<T>()
{
base.UpdateRedis<T>();
}
}
/// <summary>
/// 对象 适配器
/// </summary>
public class RedisHelpercsObjectAdpater : IHelper
{
private RedisHelpercs redisHelpercs;
public RedisHelpercsObjectAdpater(RedisHelpercs _redisHelpercs)
{
this.redisHelpercs = _redisHelpercs;
}
void IHelper.Add<T>()
{
this.redisHelpercs.AddRedis<T>();
}
void IHelper.Delete<T>()
{
this.redisHelpercs.DeleteRedis<T>();
}
void IHelper.Query<T>()
{
this.redisHelpercs.QueryRedis<T>();
}
void IHelper.Update<T>()
{
this.redisHelpercs.UpdateRedis<T>();
}
}
从代码我们可以看出: 所谓 适配器 就是 在不对原有代码进行修改的情况下, 对新填的功能部分 加了一层 甚至 两层 来适应 当前系统
class Program
{
static void Main(string[] args)
{
//以前的方式1
IHelper helper = new MysqlHelper();
helper.Add<int>();
helper.Delete<int>();
//以前的方式2
IHelper helper1 = new OraclHelper();
helper1.Add<int>();
helper1.Delete<int>();
//类的适配器 方式
IHelper helper2 = new RedisHelpercsClassAdpater();
helper2.Add<int>();
helper2.Delete<int>();
//对象适配器 方式
IHelper helper3 = new RedisHelpercsObjectAdpater(new RedisHelpercs());
helper3.Add<int>();
helper3.Delete<int>();
}
}