zoukankan      html  css  js  c++  java
  • 设计模式 适配器模式

    适配器模式分为两种,一种是对象的适配器模式,另一种是类的适配器模式。我们知道C#是单继承的,C++是多继承的。类的适配器适合用于多继承的,所以这篇文章就只讲对象的适配器。

    我们先来理解一下什么是适配器模式?

    1、在我们的生活中其实经常需要用到适配器模式的地方,例如我们的手机充电器,我们知道我国的电源电压是220V的,但是手机电池能接受的电压是3-7V,为了使得手机电池能接受220V的电源电压,需要一个变压器,把220V电压转成3-7V的电压,那么这个变压器我们就可以理解成是一个适配器。(将不适合的电压变成适合手机电池的电压)

    (手机充电器)

     

    2、再举个例子,春晓家里有三个房间,一开始这三个房间都是睡房,有一天他想把家里的一个房间从睡房变成书房。那么你会怎么改变睡房? 把里面的东西搬光光吗?还是在原有的基础上作进一步改进?我们大多都会选择后者,这也是适配器模式里的一个要点,在原有的类的基础上作一些调整变成一个新的类。我们改变的过程,是把睡房里面不适合于书房的东西搬出来,把书房需要的东西搬进去,之后进行整理,就变成了我们想要的书房。

     

    (睡房变书房后)

    通过上面两个例子我相信你对适配器模式有了一定的认识。关键只是捉住两点,第一点是适配器模式是建立在已有类的基础上。第二点是使用已有类的方法和属性,构造出我们需要的新的类。

    这么一讲我猜,你可能会觉的我们平时在做编程的时候不是经常用到适配器模式吗?是的,我们经常用到,只是一直都没有意识到这就是适配器模式!

     

      代码实现

    最后我们通过一小段C#代码来加深一下理解,我用到已有类ArrayList作一些改进,变成一个栈类,栈的特性是先进后出,我们简单的实现他先进后出就行,其他的就不实现了:

    View Code
    namespace 适配器模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                IStack stack = new AdapterStack();
                stack.Push(1);
                stack.Push("Cx");
                stack.Push("zz");
                stack.Push("kk");
    
                Console.WriteLine(stack.Pop());
                Console.WriteLine(stack.Pop());
    
                Console.ReadLine();
            }
        }
    
        interface IStack
        {
            void Push(object item);
            object Pop();
        }
    
        class AdapterStack : IStack
        {
            ArrayList adaptee;
            public AdapterStack()
            {
                adaptee = new ArrayList();
            }
            /// <summary>
            /// 入栈
            /// </summary>
            public void Push(object item)
            {
                adaptee.Add(item);
            }
    
            /// <summary>
            /// 出栈
            /// </summary>
            public object Pop()
            {
                object o = adaptee[adaptee.Count - 1];
                adaptee.RemoveAt(adaptee.Count - 1);
                return o;
            }
    
        }
    }

    大话设计模式里适配器模式的代码:

    View Code
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 适配器模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Player b = new Forwards("巴蒂尔");
                b.Attack();
    
                Player m = new Guards("麦克格雷迪");
                m.Attack();
    
                //Player ym = new Center("姚明");
                Player ym = new Translator("姚明");
                ym.Attack();
                ym.Defense();
    
                Console.Read();
            }
        }
    
        //篮球运动员
        abstract class Player
        {
            protected string name;
            public Player(string name)
            {
                this.name = name;
            }
    
            public abstract void Attack();
            public abstract void Defense();
        }
    
        //前锋
        class Forwards : Player
        {
            public Forwards(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("前锋 {0} 进攻", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("前锋 {0} 防守", name);
            }
        }
    
        //中锋
        class Center : Player
        {
            public Center(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("中锋 {0} 进攻", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("中锋 {0} 防守", name);
            }
        }
    
        //后卫
        class Guards : Player
        {
            public Guards(string name)
                : base(name)
            {
            }
    
            public override void Attack()
            {
                Console.WriteLine("后卫 {0} 进攻", name);
            }
    
            public override void Defense()
            {
                Console.WriteLine("后卫 {0} 防守", name);
            }
        }
    
        //外籍中锋
        class ForeignCenter
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public void 进攻()
            {
                Console.WriteLine("外籍中锋 {0} 进攻", name);
            }
    
            public void 防守()
            {
                Console.WriteLine("外籍中锋 {0} 防守", name);
            }
        }
    
        //翻译者
        class Translator : Player
        {
            private ForeignCenter wjzf = new ForeignCenter();
    
            public Translator(string name)
                : base(name)
            {
                wjzf.Name = name;
            }
    
            public override void Attack()
            {
                wjzf.进攻();
            }
    
            public override void Defense()
            {
                wjzf.防守();
            }
        }
    }

     

      最后PS下:这篇文章参看了微软的设计模式教程和《大话设计模式》。只有少部份文字是自己对适配器的理解。

  • 相关阅读:
    Visual Studio2017 无法添加引用的解决方法
    第13周学习进度
    mininet之miniedit可视化操作
    构建之法阅读笔记05
    软件工程课堂练习找水王续
    第12周学习进度
    VS2015做单元测试
    学习调用第三方的WebService服务
    软件工程课堂练习找水王
    第11周学习进度
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dgfgfdg646546.html
Copyright © 2011-2022 走看看