- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。适配器模式是一种结构型模式.
包含以下三个角色: 1、Target(目标抽象类): 目标抽象类定义了客户所需要的接口,可以是一个抽象类或接口,也可以是一个具体的类,由于C#不支持多继承,所以它只能是接口。 2、Adapter(适配器类): 它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配者模式的核心,在适配器模式中,它通过继承Target并关联一个Adaptee对象使二者产生联系。 3、Adaptee(适配者类): 适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码.
X公司很久以前曾经开发了一个算法库,包含了排序、查找等算法。在为某学校开发教务管理系统时,开发人员设计了一个成绩操作接口IScoreOperation,在该接口中声明了排序方法Sort(int[])和查找方法Search(int[],int),但是为了提高排序和查找的效率,决定重用算法库中的快速排序算法类QuickSort和二分查找算法类BinarySearch。算法库已经没有源码了,需要在不改动两边代码的情况下完成功能。 IScoreOperation:抽象成绩操作接口,充当目标抽象类 。
public interface IScoreOperation
{
int[] Sort(int[] array);
int Search(int[] array, int key);
}
QuickSortHelper、BinarySearchHelper:快速排序算法类、二分查找算法类,充当适配者类 。
public class QuickSortHelper
{
public int[] QuickSort(int[] array)
{
Sort(array, 0, array.Length - 1);
return array;
}
public void Sort(int[] array, int p, int r)
{
int q = 0;
if (p < r)
{
q = Partition(array, p, r);
Sort(array, p, q - 1);
Sort(array, q + 1, r);
}
}
public int Partition(int[] array, int p, int r)
{
int x = array[r];
int j = p - 1;
for (int i = p; i <= r - 1; i++)
{
if (array[i] <= x)
{
j++;
Swap(array, j, i);
}
}
Swap(array, j + 1, r);
return j + 1;
}
public void Swap(int[] array, int i, int j)
{
int t = array[i];
array[i] = array[j];
array[j] = t;
}
}
public class BinarySearchHelper
{
public int BinarySearch(int[] array, int key)
{
int low = 0;
int high = array.Length - 1;
while (low <= high)
{
int mid = (low + high) / 2;
int midVal = array[mid];
if (midVal < key)
{
low = mid + 1;
}
else if (midVal > key)
{
high = mid - 1;
}
else
{
return 1; // 找到元素返回1
}
}
return -1; // 未找到元素返回-1
}
}
OperationAdapter:成绩操作类,充当适配器类 。
public class OperationAdapter : IScoreOperation
{
private QuickSortHelper sortTarget;
private BinarySearchHelper searchTarget;
public OperationAdapter()
{
sortTarget = new QuickSortHelper();
searchTarget = new BinarySearchHelper();
}
public int Search(int[] array, int key)
{
return searchTarget.BinarySearch(array, key);
}
public int[] Sort(int[] array)
{
return sortTarget.QuickSort(array);
}
}
Program:测试代码 。
IScoreOperation operation = new OperationAdapter();
if (operation == null)
{
return;
}
int[] scores = { 84, 76, 50, 69, 90, 91, 88, 96 };
int[] result;
int score;
Console.WriteLine("测试成绩排序结果:");
result = operation.Sort(scores);
foreach (int s in result)
{
Console.Write("{0},", s.ToString());
}
Console.WriteLine();
Console.WriteLine("查找是否有90分的人:");
score = operation.Search(scores, 90);
if (score == -1)
{
Console.WriteLine("抱歉,这个真没找到~~~");
}
else
{
Console.WriteLine("恭喜,的确存在90分选手~~~");
}
Console.WriteLine("查找是否有92分的人:");
score = operation.Search(scores, 92);
if (score == -1)
{
Console.WriteLine("抱歉,这个真没找到~~~");
}
else
{
Console.WriteLine("恭喜,的确存在92分选手~~~");
}
Console.ReadLine();
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。 (2)增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。 (3)灵活性和可扩展性很好,可以通过配置文件、反射机制等,配合增加或切换新的适配器,完全符合开闭原则.
(1)C#、Java等不支持多继承,一次最多只能适配一个适配者类,不能同时使用多个。 (2)适配者类不能成为最终类,例如C#中不能为sealed类。 (3)C#、Java等类适配器模式中目标抽象类只能是接口,具有一定局限性.
最后此篇关于设计模式(六)适配器的文章就讲到这里了,如果你想了解更多关于设计模式(六)适配器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 3 个 AutoCompleteTextView,我想在它们上面注册 2 个 String[] 适配器。目前,我正在这样做: atw_from.setAdapter(new ArrayAdapt
我需要实现一个 recyclerView 来显示我对 Parse 的查询,所以我已经做到了: private class Pagination extends RecyclerView.OnScro
我对 BizTalk 相当陌生,目前我只是探索它的功能并了解不同部分(架构、编排、端口等)如何协同工作。我对其适配器有疑问: 不同的适配器是否已经随 BizTalk 服务器安装一起预装并准备好配置,或
我在 BizTalk 中测试 MQSC 适配器以与 Z/OS 主机上的队列通信时遇到问题。 测试场景:通过 Biztalk 发送消息时,我(强制)停止并启动主机 channel ,以模拟主机 IPL。
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想用我的音频单元在iPhone上录制一条音频信号,该信号来自一条普通的3.5毫米音频电缆(例如,另一部iPhone作为声源)。 由于iPhone具有4端口耳机插孔,因此无法直接插入。 我尝试了不同种
[请参阅下面的更新] 我很难定义模式。我的同事说这是适配器模式。我不知道。我们陷入困境主要是因为我们想要正确命名我们的组件。 问题:是适配器模式吗?如果不是的话是什么?如果是其他事情,这是实现这个想法
我有点不熟悉Java KeyAdapter有效,并且使用 KeyAdapter 使用以下代码得到了意想不到的结果。当按下一个键而另一个键已按下时,就会出现此问题,无论 isKeyPressed() 是
我想知道如何通过 ORM 适配器使用 Node.js 在 MySQL 中创建多个表。我通过模型创建了一个表,即“us.js” module.exports = { identity: 'us'
我有一个 JavaFx 客户端。我正在使用一个具有 ObservableSet 作为字段的 bean 作为模型。我想将这些数据显示到 ListView 中,但我无法将我的字段类型更改为 Observa
我正在尝试在 native iOS 应用程序中实现基于表单的身份验证,但我需要在没有收到质询的情况下登录,我想打开一个表单并登录。我实现了一个包含 isCustomResponse 函数的 Chall
我正在尝试为我的迭代器和 const_iterator 类实现反向迭代器适配器,但遇到了一些麻烦。如果有人可以指导我解决这个问题,将不胜感激! 我的想法是我应该能够从我的 rbegin() 和 ren
使用 spring-integration-sftp,创建任意数量的入站 channel 适配器对象的推荐方法是什么?我的应用程序需要监视多个远程目录(1 到 n),直到运行时才知道。 最佳答案 当前
我正在尝试为我们自己的框架创建适配器。我们的框架使用自己的断言机制,因此我需要编写适配器。 适配器类非常简单,如下所示: public class AllureReportListener {
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我想构建自己的自定义 log4j(网络)适配器来解决我的问题 that I posted here. 我查看了 log4j 的文档,但看不到开发人员在哪里/是否讨论如何执行此操作。 有人能给我指出正确
我使用消息驱动 channel 适配器从 weblogic JMS 队列接收作为字符串的 xml 消息,然后将此消息传递到 spring 集成 channel 以存储到数据库中,转换为不同的 xml,
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我试图为 Android 制作一个聊天应用程序,所以我使用了 RecyclerView 。我的适配器有问题,我的聊天室收到的 JSON 响应显示为空白。我的代码是否遗漏了某些内容? 这是我的适配器类
如果这是重复的,我提前道歉。我对 Android 开发还是新手,并尝试寻找解决方案,但找不到有效的解决方案。 我正在创建一个待办事项应用程序并在我的适配器中收到此错误。 java.lang.NullP
我是一名优秀的程序员,十分优秀!