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

    适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一。

    就是这种一个图:


    比方我们有这种一个旧的类:

    class OldName
    {
    public:
    	virtual void setName(string n) = 0;
    	virtual string getName() = 0;
    };
    
    class OldNameMetheds : public OldName
    {
    	string name;
    public:
    	OldNameMetheds(string n = "") : name(n)
    	{
    	}
    
    	void setName(string n)
    	{
    		name = n;
    	}
    
    	string getName()
    	{
    		return name;
    	}
    };

    这样我们仅仅能设计一个字符串的名字。可是如今我们有一个新的类:

    //base class
    class NewName
    {
    public:
    	virtual void setFirstName(string first) = 0;
    	virtual void setLastName(string last) = 0;
    	virtual string getFirstName() = 0;
    	virtual string getLastName() = 0;
    };
    
    class NewNameMethod : public NewName
    {
    protected:
    	string first_name;
    	string last_name;
    public:
    	NewNameMethod(string first = "", string last = "") : first_name(first), 
    		last_name(last)
    	{
    	}
    
    	void setFirstName(string first)
    	{
    		first_name = first;
    	}
    
    	void setLastName(string last)
    	{
    		last_name = last;
    	}
    
    	string getFirstName()
    	{
    		return first_name;
    	}
    
    	string getLastName()
    	{
    		return last_name;
    	}
    };

    旧类和新类就不兼容了。故此须要一个Adaptor接口类:

    //The real adaptor class
    class Old2NewNameAdaptor : public NewNameMethod
    {
    	OldName *old;
    public:
    	Old2NewNameAdaptor(OldName *o) : old(o)
    	{
    		string name = old->getName();
    		unsigned i = 0;
    		for (; i < name.size() && name[i] != ' '; i++)
    		{
    			first_name.push_back(name[i]);
    		}
    		for (i++; i < name.size(); i++) last_name.push_back(name[i]);
    	}
    };

    能够看到。该类继承了新类,而且自己主动处理了oldname,把oldname的内容转存进newname中了,中间就是多了一个自己主动转换的功能,并没有太多奇妙的东西。可是对于用户来说就方便非常多啦。

    然后能够这样使用:

    void Adaptor_Run()
    {
    	OldName *oldname = &OldNameMetheds();
    	oldname->setName("Bill Gate");
    
    	//小心这样写会有错误:原来的名字就会变成空了。没保留NewName *old2new = &Old2NewNameAdaptor(oldname);原因:应该是由于这个是暂时变量。指针指向一个空的暂时变量。那么是没有数据的!

    Old2NewNameAdaptor o2n(oldname); NewName *old2new = &o2n;//这样写。结果正确! cout<<"The first name is: "<<old2new->getFirstName()<<endl <<"The last name is : "<<old2new->getLastName()<<endl; }


    这里的old2new是一个新类,能够使用这个新类操作旧类的数据了。

    最后执行:





  • 相关阅读:
    linq 基本用法
    string.Substring,string.Concat的用法
    用.NET提供的Mail来发邮件
    委比
    解决启动IIS发生意外错误 0x8ffe2740
    换手
    用Windows Live Writer 2009 发布测试的
    使用matlab工具研究神经网络的简单过程(网络和数据下载)
    拳皇2000连招表
    增加网页曝光率的秘诀
  • 原文地址:https://www.cnblogs.com/llguanli/p/7060741.html
Copyright © 2011-2022 走看看