static void Main(string[] args) { { Console.WriteLine("************************"); IHelper helper = new MySqlHelper(); helper.Query <Program>(); helper.Delete <Program>(); helper.Update <Program>(); helper.Add <Program>(); } { Console.WriteLine("************************"); IHelper helper = new OracleHelper(); helper.Query <Program>(); helper.Delete <Program>(); helper.Update <Program>(); helper.Add <Program>(); } { Console.WriteLine("************************"); IHelper helper = new SqlserverHelper(); helper.Query <Program>(); helper.Delete <Program>(); helper.Update <Program>(); helper.Add <Program>(); } { //引入第三方的redis,不适配 Console.WriteLine("************************"); IHelper helper = new RedisHelperInherit();//类适配器 helper.Query <Program>(); helper.Delete <Program>(); helper.Update <Program>(); helper.Add <Program>(); } {//组合优于继承 Console.WriteLine("***************"); Console.WriteLine("************************"); IHelper helper = new RedisHelperCombination();//对象适配器 helper.Query <Program>(); helper.Delete <Program>(); helper.Update <Program>(); helper.Add <Program>(); } //都做到了适配,都能新旧适配起来 //组合优于继承 1.继承是强侵入形的 会带过来父类的方法(有多余的东西) // 2.灵活性问题(组合是依赖抽象的,继承是依赖细节的) //应用总结: //属于不救模式,全新引入新的组件要用上的 //不能在项目一开始设计的时候就搞适配器,徒增难度 //时机选择 Console.WriteLine("Hello World!"); }
/* * 举一场景来分析适配器模式: * 做Ado.Net时有一接口,不通数据库操作是都要实现这个接口,现在要加一个非关系型数据库Redis,也要 * 用这种形式进行调用 */ static void Main(string[] args) { { Console.WriteLine("*******************************"); IDbHelper helper = new SqlServiceHelper(); Program p = null; helper.Add <Program>(p); helper.Update <Program>(p); helper.Delete <Program>(p); helper.Query <Program>(p); } { Console.WriteLine("*******************************"); IDbHelper helper = new MySqlHelper(); Program p = null; helper.Add <Program>(p); helper.Update <Program>(p); helper.Delete <Program>(p); helper.Query <Program>(p); } { Console.WriteLine("*******************************"); IDbHelper helper = new OracleHelper(); Program p = null; helper.Add <Program>(p); helper.Update <Program>(p); helper.Delete <Program>(p); helper.Query <Program>(p); } { /* 有一个第三方Redis的类库RedisHelper的帮助类,现在要实现使用该类的方式,要像使用关系型数据库一样,现在不适配,怎么适配一下 */ //1.通过继承的方式来实现,在外面包一层RedisHelperInherit,通过调用RedisHelperInherit来实现 Console.WriteLine("*************通过继承的方式来实现,在外面包一层RedisHelperInherit,通过调用RedisHelperInherit来实现******************"); IDbHelper helper = new RedisHelperInherit(); Program p = null; helper.Add <Program>(p); helper.Update <Program>(p); helper.Delete <Program>(p); helper.Query <Program>(p); } { /*2.通过组合的方式来实现*/ Console.WriteLine("*************通过组合的方式来实现,在外面包一层RedisHelperCombinnation,通过调用RedisHelperCombinnation来实现******************"); IDbHelper helper = new RedisHelperCombinnation(); Program p = null; helper.Add <Program>(p); helper.Update <Program>(p); helper.Delete <Program>(p); helper.Query <Program>(p); } /*分析两种方式优劣: * 组合优于继承 * 1.继承是强侵入性的(有多余的东西),因为这样 new RedisHelperInherit().点后面会有AddRedis等方法,但这样方式不是我们要的; * new RedisHelperInherit().AddRedis * 2.灵活性问题(组合是依赖抽象的,继承是依赖细节的) */ }
static void Main(string[] args) { try { { IHelper helper = new SqlServerHelper(); helper.Add <Program>(); helper.Delete <Program>(); helper.Query <Program>(); helper.Update <Program>(); } { IHelper helper = new OracleHelper(); helper.Add <Program>(); helper.Delete <Program>(); helper.Query <Program>(); helper.Update <Program>(); } { IHelper helper = new MysqlHelper(); helper.Add <Program>(); helper.Delete <Program>(); helper.Query <Program>(); helper.Update <Program>(); } { //由于Redis是第三方的类库,虽然当中也有增删改查, //但我们无法直接让其继承IHelper 故而无法像如下使用 //此时我们应当考虑适配器模式 // IHelper helper = new RedisHelper(); // helper.Add<Program>(); // helper.Delete<Program>(); // helper.Query<Program>(); // helper.Update<Program>(); } { IHelper helper = new RedisHelperInherit(); helper.Add <Program>(); helper.Delete <Program>(); helper.Query <Program>(); helper.Update <Program>(); RedisHelperInherit helperInherit = new RedisHelperInherit(); helperInherit.AddRedis <Program>(); //强侵入性,继承导致父类有的子类必须也有 } { IHelper helper = new RedisHelperCombination(); helper.Add <Program>(); helper.Delete <Program>(); helper.Query <Program>(); helper.Update <Program>(); } } catch (Exception e) { Console.WriteLine(e.Message); // throw; } }