结构型设计模式之适配器设计模式的两种实现方法
目录
一、适配器模式的概念和使用介绍
二、通过创建适配器类继承第三方模块并实现接口方式
三、
一、适配器模式的概念和使用介绍
1、问题引入:
- 生活中的适配器: 比如电脑的各种适配器,手机充电器等
- 软件中: 做项目的时候,有时会需要单独设计或者买一个模块集成到项目中。
模块获取有两种方式:
第一种 是定制,给出要求;
第二种 是:直接购入就是非定制的,这种情况下出现第三方的接口和我们需要的接口不同是很正常的,但是我们又得集成到项目中,就得做适配
2、适配器模式的概念: 将一个类的“接口”转换为需要的“另一个接口”,此处接口是广义概念
二、通过创建适配器类继承第三方模块并实现接口方式
1、测试步骤介绍:
- 创建一个AdapterDesignPattern控制台
- 创建IbizLogicalInterface接口类
- 基于IbizLogicalInterface类实现接口ABizLogical、BBizLogical
- 创建一个类CBizLogical模拟第三方模块,用来测试适配器模式
- 创建一个适配器类AdapterBaseClass继承CBizLogical同时实现接口
- program类内测试三个接口实现类的实现结果
2、补充:
- 在适配器模式 实现过程中,在实现常规业务的同时,还可以增加我们想要的东西,这点其实就是AOP思想的一个体系
- 总之就是将不符合需要的接口做二次包装(可增加其他业务),对调用者没有任何影响
3、代码实现步骤:
(1)、根据步骤创建所需类
(2)、接口IbizLogicalInterface代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
public interface IbizLogicalInterface
{
void DoLogical1<T1, T2>(T1 t1 ,T2 t2 );
void DoLogical2<T1, T2>(T1 t1, T2 t2);
void DoLogical3<T1, T2>(T1 t1, T2 t2);
//还可以继续添加其他接口
}
}
(3)、接口实现ABizLogical代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
public class ABizLogical : IbizLogicalInterface
{
public void DoLogical1<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("A业务实现接口,执行方法【1】");
}
public void DoLogical2<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("A业务实现接口,执行方法【2】2");
}
public void DoLogical3<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("A业务实现接口,执行方法【3】");
}
}
}
(4)、接口实现BBizLogical代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
public class BBizLogical : IbizLogicalInterface
{
public void DoLogical1<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("B业务实现接口,执行方法【1】");
}
public void DoLogical2<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("B业务实现接口,执行方法【2】");
}
public void DoLogical3<T1, T2>(T1 t1, T2 t2)
{
Console.WriteLine("B业务实现接口,执行方法【3】");
}
}
}
(5)、模仿第三方模块CBizLogical的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
public class CBizLogical
{
public void ExcuteMethod1()
{
Console.WriteLine("第三方业务或模块实现【1】");
}
public void ExcuteMethod2()
{
Console.WriteLine("第三方业务或模块实现【2】");
}
public void ExcuteMethod3()
{
Console.WriteLine("第三方业务或模块实现【3】");
}
public void ExcuteMethod4()
{
Console.WriteLine("第三方业务或模块实现【4】");
}
}
}
(6)、用来做适配的适配器类AdapterBaseClass的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
public class AdapterBaseClass : CBizLogical, IbizLogicalInterface
{
public void DoLogical1<T1, T2>(T1 t1, T2 t2)
{
//在这个地方可以添加需要的业务逻辑
base.ExcuteMethod1();//对接口做了一层包装,就变成了我们需要的接口
}
public void DoLogical2<T1, T2>(T1 t1, T2 t2)
{
//还可以在这里添加我们想要加的业务逻辑
base.ExcuteMethod2();
base.ExcuteMethod3();//可以调用多个方法
}
public void DoLogical3<T1, T2>(T1 t1, T2 t2)
{
//还可以在这里添加我们想要加的业务逻辑
base.ExcuteMethod4();//base代表CBizLogical第三方我们需要是配的模块
}
}
}
(7)、测试方法Program的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdapterDesignPattern
{
class Program
{
static void Main(string[] args)
{
//调用接口实现类ABizLogical
IbizLogicalInterface aLogical1 = new ABizLogical();
aLogical1.DoLogical1<string, int>("",1);
aLogical1.DoLogical2<string, int>("", 1);
aLogical1.DoLogical3<string, int>("", 1);
Console.WriteLine("-------------------------------------------------------");
//调用接口实现类BBizLogical
IbizLogicalInterface bLogical1 = new BBizLogical();
bLogical1.DoLogical1<int, int>(1, 2);
bLogical1.DoLogical2<int, int>(1, 2);
bLogical1.DoLogical3<int, int>(1, 2);
Console.WriteLine("-------------------------------------------------------");
//调用第三方不符合接口规范,但是经过适配器适配的CBizLogical
//IbizLogicalInterface cLogical = new CBizLogical();//不能这样做,因为是第三方模块,不符合接口标准,需要适配
IbizLogicalInterface cLogical1 = new AdapterBaseClass();
cLogical1.DoLogical1<int, int>(1, 3);
cLogical1.DoLogical2<int, int>(1, 3);
cLogical1.DoLogical3<int, int>(1, 3);
Console.ReadKey();
}
}
}
(8)、测试结果如图: