關於CPU個數、核數、執行緒數的理解
阿新 • • 發佈:2022-04-12
假如現在一個已經上線了的專案,現在為了提高效能需要增加Redis。
Redis的資料操作,第三方已經給提供了,但是他提供的資料操作介面和現在的介面不同,呼叫端又希望按照之前定義的介面來呼叫。
介面卡模式就是解決這類問題的。
程式碼演示:
/// <summary> /// 資料操作介面 /// </summary> public interface ISqlHelper { void Add<T>(); void Delete<T>(); void Update<T>(); void Query<T>(); } /// <summary> /// SqlServer 資料庫操作類 /// </summary> public class SqlServerHelper : ISqlHelper { public void Add<T>() { Console.WriteLine($"This is {this.GetType().Name} Add."); } public void Delete<T>() { Console.WriteLine($"This is {this.GetType().Name} Delete."); } public void Query<T>() { Console.WriteLine($"This is {this.GetType().Name} Query."); } public void Update<T>() { Console.WriteLine($"This is {this.GetType().Name} Update."); } } /// <summary> /// Redis 資料庫操作類 /// 假設是第三方提供的,而且不能修改 /// </summary> public class RedisHelper { public void AddRedis<T>() { Console.WriteLine($"This is {this.GetType().Name} Add!"); } public void DeleteRedis<T>() { Console.WriteLine($"This is {this.GetType().Name} Delete!"); } public void UpdateRedis<T>() { Console.WriteLine($"This is {this.GetType().Name} Update!"); } public void QueryRedis<T>() { Console.WriteLine($"This is {this.GetType().Name} Query!"); } } /// <summary> /// 介面卡: 通過繼承的方式實現適配(滿足ISqlHelper介面,另外繼承RedisHelper) /// </summary> public class RedisHelperInherit : RedisHelper, ISqlHelper { public void Add<T>() { base.AddRedis<T>(); } public void Delete<T>() { base.DeleteRedis<T>(); } public void Query<T>() { base.QueryRedis<T>(); } public void Update<T>() { base.UpdateRedis<T>(); } } /// <summary> /// 呼叫 /// </summary> static void Main(string[] args) { ISqlHelper sqlHelper = new SqlServerHelper(); sqlHelper.Add<Student>(); Console.WriteLine("**************************************"); ISqlHelper redisHelper = new RedisHelperInherit(); redisHelper.Add<Student>(); Console.ReadKey(); }
上面的示例是採用繼承的方式來實現的,下面的程式碼將採用組合的方式來實現,程式碼如下:
/// <summary> /// 介面卡:通過組合的方式來實現 /// </summary> public class RedisHelperCombination : ISqlHelper { /// <summary> /// 欄位屬性方式組合(方式一) /// 預設構造,特別強硬的 /// </summary> private RedisHelper redisHelper = new RedisHelper(); private RedisHelper _RedisHelper = null; /// <summary> /// 建構函式方式組合(方式二) /// 例項化時傳入,相對欄位屬性靈活一點 /// </summary> public RedisHelperCombination(RedisHelper redisHelper) { this._RedisHelper = redisHelper; } /// <summary> /// 方法方式組合 /// 物件 可有可無,因為方法可呼叫可不呼叫 /// </summary> public void AddRedisHelper(RedisHelper redisHelper) { this._RedisHelper = redisHelper; } void ISqlHelper.Add<T>() { this.redisHelper.AddRedis<T>(); } void ISqlHelper.Delete<T>() { this.redisHelper.DeleteRedis<T>(); } void ISqlHelper.Query<T>() { this.redisHelper.QueryRedis<T>(); } void ISqlHelper.Update<T>() { this.redisHelper.UpdateRedis<T>(); } }