乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
[索引页][源码下载]

乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

作者:webabcd

介绍
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

示例
有一个Message实体类,某个类对它的操作有Insert()和Get()方法。现在需要把这个类转到另一个接口,分别对应Add()和Select()方法。

MessageModel

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Adapter
{
    /**//// <summary>
    /// Message实体类
    /// </summary>
    public class MessageModel
    {
        /**//// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="msg">Message内容</param>
        /// <param name="pt">Message发布时间</param>
        public MessageModel(string msg, DateTime pt)
        {
            this._message = msg;
            this._publishTime = pt;
        }

        private string _message;
        /**//// <summary>
        /// Message内容
        /// </summary>
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        private DateTime _publishTime;
        /**//// <summary>
        /// Message发布时间
        /// </summary>
        public DateTime PublishTime
        {
            get { return _publishTime; }
            set { _publishTime = value; }
        }
    }
}

SqlMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Adapter
{
    /**//// <summary>
    /// 源(Adaptee)角色
    /// Sql方式操作Message
    /// </summary>
    public class SqlMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public List<MessageModel> Get()
        {
            List<MessageModel> l = new List<MessageModel>();
            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));

            return l;
        }

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public bool Insert(MessageModel mm)
        {
            // 代码略
            return true;
        }
    }
}

IMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Adapter
{
    /**//// <summary>
    /// 目标(Target)角色
    /// 操作Message的接口
    /// </summary>
    public interface IMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        List<MessageModel> Select();

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        bool Add(MessageModel mm);
    }
}

Message

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Adapter
{
    /**//// <summary>
    /// 适配器(Adapter)角色
    /// 类适配器
    /// 把源适配到这个类
    /// </summary>
    public class Message : SqlMessage, IMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public List<MessageModel> Select()
        {
            return base.Get();
        }

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public bool Add(MessageModel mm)
        {
            return base.Insert(mm);
        }
    }
}

Message2

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Adapter
{
    /**//// <summary>
    /// 适配器(Adapter)角色
    /// 对象适配器
    /// 把源适配到这个类
    /// </summary>
    public class Message2 : IMessage
    {
        private SqlMessage _sqlMessage;

        /**//// <summary>
        /// 构造函数
        /// </summary>
        public Message2()
        {
            _sqlMessage = new SqlMessage();
        }

        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public List<MessageModel> Select()
        {
            return _sqlMessage.Get();
        }

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public bool Add(MessageModel mm)
        {
            return _sqlMessage.Insert(mm);
        }
    }
}

client

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Pattern.Adapter;

public partial class Adapter : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IMessage m;

        m = new Message();
        Response.Write("类适配器方式<br />");
        Response.Write(m.Add(new MessageModel("插入", DateTime.Now)));
        Response.Write("<br />");
        Response.Write(m.Select()[0].Message + " " + m.Select()[0].PublishTime.ToString());
        Response.Write("<br /><br />");

        m = new Message2();
        Response.Write("对象适配器方式<br />");
        Response.Write(m.Add(new MessageModel("插入", DateTime.Now)));
        Response.Write("<br />");
        Response.Write(m.Select()[0].Message + " " + m.Select()[0].PublishTime.ToString());
        Response.Write("<br />");
    }
}

运行结果
类适配器方式
True
SQL方式获取Message 2007-4-8 20:59:29

对象适配器方式
True
SQL方式获取Message 2007-4-8 20:59:29

参考
http://www.dofactory.com/Patterns/PatternAdapter.aspx

OK
[源码下载]

时间: 2025-01-26 09:03:31

乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)的相关文章

乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:webabcd 介绍 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例 有一个Message实体类,某些对象对它的操作有Insert()方法,当发生某些改变的时候,通知所有这些对象并执行Insert()方法. MessageModel using

乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:webabcd 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert()和Get()方法,现在扩展这个对象的功能. MessageModel using System;using System.Collecti

【设计模式】—— 适配器模式Adapter

模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器] Target 目标接口 Adaptee 现有的类 Adapter 中间转换的类,即实现了目标接口,又继承了现有的类. 1 package com.xingoo.test1; 2 interface Target{ 3 public void operation1(); 4 public void

解读设计模式----适配器模式(Adapter Pattern)

在金庸笔下,三大神功都是难得之宝,多少人为得到他而......,仔细的分析下这三大神功,还是北冥较好,呵呵.我们从软件设计的角度来看,这不知算不算得上是一种复用(功力复用)的思想,只不过有点残忍罢.而在软件设计领域里,"复用"在某些时候也会出现很多问题,比如平台不兼容,开发语言不同或是接口不同等多种原因,弄得不好会不会出现既浪费了别人的现有资源,而自己的系统又无法完成呢?这有点像吸星----损人又损己. 企图将设计做好,就能够一劳永逸地坐享其成,这样的愿望就好上面所提到的吸星神功一般,

设计模式之适配器模式(adaptor pattern)

1 适配器模式的定义 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 2 实际应用中的例子 比如我们去日本买了一个日本的电饭煲,但日本电压标准都是110V,而我们国家标准是220V,所以要想在中国用日本电饭煲,需要一个电源适配器. 比如我们有一个micro SD卡,如果我们想在笔记本上用,就需要一个读

温故而知新:设计模式之适配器模式(Adapter)

借用terrylee的原话: Adapter模式主要应用于"希望复用一些现存的类,但是接口又与复用环境要求不一致的情况",在遗留代码复用.类库迁移等方面非常有用. 适配器模式再次体现了"面向接口编程,而非面向实现编程"这一精神. 场景: 有一个基于数据库的系统,里面的数据库操作就拿最常用的查询来说,主要是用SqlHelper类里的QueryData(string sql)这个方法来处理的,后来意外发现该方法实现上性能并不是最好(或者不能满足新的需要),而这时正好有一

Python设计模式Adapter Pattern例子详解

Python设计模式 3种类型:  1. 创建型     *灵活方式创建对象*          - 抽象工厂          - 建造者          - 工厂方法          - 原型          - 单例  2. 结构型      *将一种对象改装为另一种对象,或将小对象合成大对象*          - 适配器          - 桥接          - 组合          - 修饰器          - 外观          - 享元         

设计模式之适配器模式

设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 适配器模式 Adapter Pattern 也叫做变压器模式,也叫包装模式 将一个类的接口变换成客户端所期待的另一个接口,从而使原本接口不匹配而无法再一起工作的两个类能够在一起工作 通用类图 组成 目标角色 定义把其他类转换为何种接口,也就是我们的期望接口 源角色 你想把谁转换成目标角色 适配器角色 把源角色转换为目标角色 通用源码 JAVA //目标角色

C#设计模式(7)——适配器模式(Adapter Pattern)

原文:C#设计模式(7)--适配器模式(Adapter Pattern) 一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将"将现存的对象"在新的环境中进行调用呢?解决这个问题的办法就是我们本文要介绍的适配器模式--使得新环境中不需要去重复实现已经存在了的实现而很好地把现有对象(指原来环境中的现有对象)加入到新环境来使用. 二.适配器模式的详细介绍 2.1 定义  下面让我