zoukankan      html  css  js  c++  java
  • 设计模式之适配器模式(结构型)

    @

    模式定义

    适配器模式(Adapter Pattern):将一个接口转换成客户希望的接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

    模式角色

    适配器模式包括如下角色

    • Traget(目标抽象类)
    • Adapter(适配器类)
    • Adaptee(适配者类)
    • Client(客户类)

    模式分析

    适配器模式将目标类和适配者类解耦,引入一个适配器类来重用适配者类,具体的实现是在适配者类的,通过适配器模式,客户端类就不知道适配者类的具体实现了,

    典型的类适配器代码:

    public class Adapter extends Adaptee implements Target
    {
    	public void request()
    	{
    		specificRequest();
    	}
    }
    
    

    典型的对象适配器代码:

    public class Adapter extends Adaptee implements Target
    {
    	public void request()
    	{
    		specificRequest();
    	}
    }
    
    

    模式例子

    某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法

    本例子来自《设计模式》一书

    目标类:

    public abstract class DataOperation
    {
    	private String password;
    	
    	public void setPassword(String password)
    	{
    		this.password=password;
    	}
    		
    	public String getPassword()
    	{
    		return this.password;
    	}
    	
    	public abstract String doEncrypt(int key,String ps);
    }
    

    适配者类:

    public final class Caesar 
    {
    	public String doEncrypt(int key,String ps)
    	{   
    		String es="";
    		for(int i=0;i<ps.length();i++)
    		{
    			char c=ps.charAt(i);
    			if(c>='a'&&c<='z')
    			{
    				c+=key%26;
    			if(c>'z') c-=26;
    			if(c<'a') c+=26;
    			}
    			if(c>='A'&&c<='Z')
    			{
    				c+=key%26;
    			if(c>'Z') c-=26;
    			if(c<'A') c+=26;
    			}
    			es+=c;
    		}
    		return es;
    	}
    }
    

    适配器类:

    public class CipherAdapter extends DataOperation
    {
    	private Caesar cipher;
    	
    	public CipherAdapter()
    	{
    		cipher=new Caesar();
    	}
    	
    	public String doEncrypt(int key,String ps)
    	{
    		return cipher.doEncrypt(key,ps);
    	}
    }
    
    public class NewCipherAdapter extends DataOperation
    {
    	private NewCipher cipher;
    	
    	public NewCipherAdapter()
    	{
    		cipher=new NewCipher();
    	}
    	
    	public String doEncrypt(int key,String ps)
    	{
    		return cipher.doEncrypt(key,ps);
    	}
    }
    
    
    
    

    模式分类

    适配器模式可以分为默认适配器和双向适配器

    默认适配器
    在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。

    双向适配器
    如果在对象适配器中,在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么这个适配器就是一个双向适配器

    模式应用

    • JDBC驱动软件都是一个介于jdbc接口和数据库引擎接口之间的适配器软件。JDBC驱动软件使java程序可以适配各种数据库引擎
    • Spring AOP框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适配器模式来实现。
  • 相关阅读:
    VC++文件操作之最全篇
    MFC六大核心机制之五、六:消息映射和命令传递
    MFC六大核心机制之四:永久保存(串行化)
    MFC六大核心机制之三:动态创建
    MFC六大核心机制之二:运行时类型识别(RTTI)
    MFC六大核心机制之一:MFC程序的初始化
    VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
    VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
    java并发系列(四)-----源码角度彻底理解ReentrantLock(重入锁)、AQS
    java并发系列(三)-----ReentrantLock(重入锁)功能详解和应用演示
  • 原文地址:https://www.cnblogs.com/mzq123/p/10498604.html
Copyright © 2011-2022 走看看