面向对象编程思想-适配器模式

一、引言

富兰克林揭秘了雷电的真实面目,那我们是否设想过将雷电储存下来呢?生活中如果买了国外的电器(美国、日本)使用电压为110V的,可国内通常电压是220V的,国外电器使用电压与国内电压不符,那怎么才能让它适用国内这个环境而正常使用呢?我们知道这时候需要用到电源适配器220V-110V,电器才能正常使用。电源适配器实现能使用220V电压方法,但实质调用的是使电器能使用110V电压这一行为。类比在程序设计中,也存在这样的思想,没错就是我们今天要学习的结构型设计模式之适配器模式

二、适配器模式

定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。

适配器模式有类适配器模式和对象适配器模式,下面是类的适配器模式代码demo

  //客户所期待的接口,目标可以是具体或者抽象的类,也可以是接口(充当现有三孔插头电器)
    public interface IThreeHole
    {
        void Request();
    }
  //两口插头 源角色- 需要适配的类(可以理解为现有一个两孔插座)
    public abstract class TwoHole
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是两孔插头");
        }
    }
    //电源适配器 (类适配器)
    //适配器提供三孔插头的行为  实质调用两孔插头的方法
    public class PowerAdapter : TwoHole, IThreeHole
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }
     static void Main(string[] args)
        {
            //(类的适配器)通过电源适配器 使用两孔插头
            IThreeHole hole = new PowerAdapter();
            hole.Request();
            Console.Read();

        }

下面是对象的适配器代码demo

   //三孔插头  目标角色
    public class ThreeHole
    {
        public virtual void Request()
        {

        }
    }
   //两孔插头 源角色
    public class TwoHole1
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是两孔插头");
        }
    }
  //(对象的适配器类)适配器类 没有继承TwoHole1类
    //通过在内部包装一个Twohole1对象,使得源接口转换成目标接口
    public class PowerAdapter1 : IThreeHole
    {
        //引用两孔插头对象 使得客户端可以通过适配器使用两孔插头的行为
        private TwoHole1 hole = new TwoHole1();
        public void Request()
        {
            hole.SpecificRequest();
        }
    }
     static void Main(string[] args)
        {//(对象的适配器)
            IThreeHole hole1 = new PowerAdapter1();
            hole1.Request();
            Console.Read();
        }

类适配器优点

1.在不修改原有代码的基础上复用现有类,很好的复合了“开闭原则”

2.可以重新定义被适配器类的部分行为,因为适配器类是被适配器类的子类

缺点:当适配器类匹配被适配器类及它的所有子类时,因为C#中类不能被多继承,所以用类的适配器模式是实现不了的。两个类耦合度较高。

对象适配器优点

1.相比类适配器模式的优点,对象适配器采用“对象组合”的方式,更加的“松耦合”lll

缺点:重定义被适配器类的行为较困难,这时就需要生成被适配器的子类,并引入被适配器的子类而不是被适配器类

使用场景:复用一些现有的类,但是接口又与现有环境不一致的情况,如.NET类库提供的适配器DataAdapter。

本文关于设计模式之适配器模式的学习就到这里了,结构型设计模式更加关注类或者对象组合成的结构及依赖关系。

文中如有不足,欢迎斧正,感谢您的阅读。

时间: 2024-12-27 20:08:06

面向对象编程思想-适配器模式的相关文章

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)(转发)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想的哲学起源(转载)

http://www.xuebuyuan.com/566309.html 本来想象着写一整篇「面向对象编程思想的哲学起源」这样的题目,笔走纸上,方才发现这样的题目足够出本书,知识不够,写不动.但心里还是想写点自己的所思所想. 全篇就拿JAVA来举例了.众所周知,面向对象的四大基本要素:抽象(Abstract).封装(Encapsulation).继承(Inheritance).多态(Polymorphism). 很多人坚持<逻辑学>是唯物哲学的基础,不懂,姑且不论.哲学就是对自然学科的抽象,看

面向对象编程思想(前传)--你必须知道的javascript(转载)

原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 call apply band js中的闭包 什么是高阶函数 在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 javascript是一门典型的动态类型语

面向对象编程思想 - 月亮晶石的日志 - 网易博客

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统).这可以使系统直接地映射问题域,保

[Javascript] 面向对象编程思想

1.创建对象 1.1 new 用new进行创建对象: var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = 'ajun'; 1.2{} 用{}创建对象,如: var user = { 'name':'ajun, 'age':12 } 这里同时候为user添加了两个属性分别为:name,age 在以上代码稍加改造,你还可以为一个对象添加一个方法,如: var user = { 'name':'ajun', 'age':12 '

第三章面向对象编程思想

""" 编码规范: 类名首字母应以大写字母开头 类的成员/属性: 成员属性 实例化对象的属性: self.name=name 可以被访问,也可以在类的外部被修改 私有属性 实例化对象的私有属性: self.__age=age 属性名前加两下划线 外部无法被访问, 也不能被修改,只能内部访问和修改 想要在外部访问只能自定义一个方法了 强制访问 私有属性: p._People__age 对象名._类名__私有属性 公共属性: 类的属性,也叫静态属性,他是在类的内部定义的 clas

面向对象编程思想2s

面向对象编程思想 抽象 封装和数据隐藏 多态 继承 代码的可复用性 面向对象分析 五个层次.五个活动组成 目的 1.获得系统的对象个体.个体内部的状态.个体与个体间的交互 活动 1.建模系统功能 2.发现并且确定业务对象 3.组织对象并确定其关系 抽象 舍弃个别的.非本质的特征,抽取共同的.本质的特征 ss 原文地址:https://www.cnblogs.com/cnblogzaizai/p/12028791.html