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

    • 结构型模式
    • 适配器模式
    • 类适配器和对象适配器

    结构型模式

    结构型模式的重点在于如何通过灵活的体系组织不同的对象,并在此基础上完成更为复杂的类型(或者类型系统),而参与组合的各类型之间始终保持尽量松散的结构关系。
    结构型模式包括以下几种:

    • 适配器模式
    • 桥接模式
    • 组合模式
    • 装饰模式
    • 外观模式
    • 享元模式
    • 代理模式

    适配器模式

    GOF对适配器模式的描述为:
    Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype..
    — Design Patterns : Elements of Reusable Object-Oriented Software

    使用适配器模式主要有两个方面的目的:

    • 旧接口在新的环境下不兼容时,借助适配器模式完成从旧接口到新接口的转换。
    • 将“既有系统”进行封装,逻辑上客户程序不知道“既有系统”的存在,将变化隔离在Adapter部分。如果客户程序需要迁移,仅需要在Adapter部分做修改。

    类适配器和对象适配器

    适配器的实现一般有两种方式:

    • 类适配器,通过继承让适配器类具有既有类型的特点,同时也可以根据客户程序的需要,满足新接口的需要
    • 对象适配器,在适配器里保存一个既有类型的引用,它自身按照客户程序的要求,实现新接口。

    定义ITarget和Adaptee

    public interface ITarget
    {
        void Request();
    }
    public class Adaptee
    {
        public void SpecifiedRequest() { }
    }
    

    类适配器

    public class ObjectAdapter : Adaptee, ITarget
    {
        public void Request()
        {
            //其他处理
            //...
            base.SpecifiedRequest();
            //...
        }
    }
    

    对象适配器

    public class ClassAdapter : ITarget
    {
        private Adaptee adaptee;
    
        public void Request()
        {        
            //其他处理
            //...
            adaptee.SpecifiedRequest();
            //...
        }
    }
    

    两者的区别有:

    类适配器 对象适配器
    基于继承概念 基于对象组合的思路
    适配器之前不能继承自其他类、 Target只能是接口形式的ITarget Target可能是ITarget(接口), TargetRase(抽象类),甚至是实体类,只要Adapter满足不继承两个或两个以上类的限制即可
    可以覆盖 Adaptee的某些方法 无法覆盖 Adaptee的方法
    虽然不可以适配子类,但可以通过覆盖修改某些方法,部分情况下可以达到配子类同样的效果 不仅可以适配 Adaptee,还可以适配 Adaptee的任何子类

    类适配器和对象适配器最大的区别在于对既有类型的使用上,在扩展新功能的时候,前者使用了继承,后者使用组合的方式。对象适配器相对而言是被推荐的方式,因为使用组合带来的耦合往往比继承更松散。

    对象适配器的UML类图为:
    适配器模式 UML类图

    所以适配器模式主要包括三个角色:

    • Target(ITarget):调用端所期待的接口;
    • Adaptee:需要被适配的类型;
    • Adapter:适配器,完成从Adaptee到Target的转换。

    适配器模式是一种相对简单,而且使用广泛的模式,在需要实现接口间的兼容、隔离变化的时候,是一种很好的选择。

    参考书籍:
    王翔著 《设计模式——基于C#的工程化实现及扩展》

  • 相关阅读:
    集算器如何优化SQL计算(2)分组
    集算器如何优化SQL计算(1)动态列
    android DOM解析Xml
    ASP.NET 抓取网页内容
    抓取HTML网页数据
    [转]Android的网络与通信
    Android的三种网络通信方式
    Android通过onDraw实现在View中绘图操作
    Android Canvas类介绍
    DatabaseMetaData的用法(转)
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/13296031.html
Copyright © 2011-2022 走看看