首页 > 其他分享 >设计模式(六)适配器

设计模式(六)适配器

时间:2023-09-19 10:24:46浏览次数:40  
标签:Console int 适配 适配器 接口 array 设计模式

一、定义

将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。适配器模式是一种结构型模式。

二、描述

包含以下三个角色:
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、优点

(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
(2)增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
(3)灵活性和可扩展性很好,可以通过配置文件、反射机制等,配合增加或切换新的适配器,完全符合开闭原则。

2、缺点

(1)C#、Java等不支持多继承,一次最多只能适配一个适配者类,不能同时使用多个。
(2)适配者类不能成为最终类,例如C#中不能为sealed类。
(3)C#、Java等类适配器模式中目标抽象类只能是接口,具有一定局限性。

标签:Console,int,适配,适配器,接口,array,设计模式
From: https://www.cnblogs.com/WinterSir/p/17302772.html

相关文章

  • HeadFirst设计模式学习之OO设计模式入门
    【一】引入---鸭子无论在哪门编程语言中,都离不开我们最熟悉的鸭子模型,因此作者在引入部分也是利用鸭子作为案例引入我们进行入门的学习【1】鸭子游戏现在我们需要做一款模拟鸭子游泳的游戏在游戏中,有不同的鸭子,不同的鸭子都会游泳和呱呱叫而这款游戏的实现思路就是一......
  • 前端设计模式:单例模式(Singleton)
    00、基本概念单例模式(SingletonPattern),也称单体模式,就是全局(或某一作用域范围)唯一实例,大家共享、复用一个实例对象,也可减少内存开销。单例模式应该是最基础、也最常见的设计模式了。✅常见场景:全局状态vuex,Jquery中的全局对象$,浏览器中的window、document都算是单例。......
  • 设计模式-工厂模式
    (目录)设计模式-工厂模式介绍工厂模式是一种创建对象的设计模式,它提供了一种将对象的创建逻辑封装在一个工厂类中的方式。工厂模式可以隐藏对象的创建细节,使客户端代码与具体的对象创建过程解耦。在工厂模式中,有一个抽象的工厂类,它定义了一个创建对象的接口,具体的对象创建由实......
  • 趣解设计模式之《新娘到底叫啥名啊?》
    〇、小故事前一段时间,在网上流传了这么一段视频,视频是一对新人的婚礼现场,主持人让新郎当着众多亲戚朋友的面,大声对新娘表达自己的爱意,小伙子自信满满大声的对众人说:“我爱你,周秀楠!”。但是台下的新娘却一脸茫然,从表情中根本没有看出一丝丝因为新郎的表白而开心的喜悦。主持人......
  • 软件设计模式系列之七——原型模式
    1模式的定义原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和动态。原型模式的关......
  • 设计模式7大原则
    开闭原则对扩展开放,对修改关闭。依赖倒置原则面向接口编程。单一职责原则一个类、接口、方法只负责一项职责。接口隔离原则接口中方法尽量少。迪米特法则尽量降低类与类之间的耦合。里氏替换原则引用父类的地方能使用其子类。合成复用原则尽量使用合成/聚合的方式,不是使用继......
  • 【设计模式】模板方法模式Template Method:实现同一模板框架下的扩展
    (目录)模板方法模式的原理和代码实现都比较简单,也被广泛应用,但是因为使用继承机制,副作用往往盖过了主要作用,所以在使用时尤其要小心谨慎。原理模板方法模式原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某......
  • 【设计模式】访问者模式Visitor:实现对象级别的矩阵结构
    (目录)访问者模式:一个原理看似很简单,但是理解起来有一定难度,使用场景相对较少的行为型模式:它能将算法与其所作⽤的对象隔离开来假如有这样⼀位⾮常希望赢得新客户的资深保险代理⼈。他可以拜访街区中的每栋楼,尝试向每个路⼈推销保险。所以,根据⼤楼内组织类型的不同,他可......
  • 【设计模式】解释器模式Interpreter Pattern:实现自定义配置规则功能
    解释器模式使用频率不算高,**通常用来描述如何构建一个简单“语言”的语法解释器。**它只在一些非常特定的领域被用到,比如:编译器;规则引擎;正则表达式;SQL解析等。不过,了解它的实现原理,可以帮助思考如何通过更简洁的规则来表示复杂的逻辑。模式原理分析解释器模式的原始......
  • 使用设计模式改写if/else或switch/case语句
    在写代码的时候,经常会用到if/else语句或者switch/case语句。虽然很省事,但是没有体现到java的封装、继承、多态等特性。没有用到java的面向对象编程的精髓。比如这种if/else语句:Stringstr="菠萝";if("苹果".equals(str)){ System.out.println("又大又红的苹果");}else......