设计模式-双向适配器的实现

实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。

 

 java代码

Adapter

复制代码
public class Adapter implements CatTarget, DogAdaptee {

    private CatTarget cattarget;
    private DogAdaptee dogadaptee;
    public Adapter() {
        // TODO Auto-generated constructor stub
    }

    public void setCattarget(CatTarget cat) {
        this.cattarget=cat;
    }
    public void setDogAdaptee(DogAdaptee dog) {
        this.dogadaptee=dog;
    }
    @Override
    public void wang() {
        // TODO Auto-generated method stub

        System.out.println("猫学狗汪汪叫");
        cattarget.catchMouse();

    }

    @Override
    public void catchMouse() {
        // TODO Auto-generated method stub
        System.out.println("狗学猫抓老鼠");
        cattarget.catchMouse();

        dogadaptee.wang();
    }

}
复制代码

CarTarget

public interface CatTarget {

    public abstract void catchMouse();
}

ConcreteCarTarget

复制代码
public class ConcreteCatTarget implements CatTarget {

    
    @Override
    public void catchMouse() {
        // TODO Auto-generated method stub

        System.out.println("抓老鼠");
    }

}
复制代码

ConcreteDogAdaptee

复制代码
public class ConcreteDogAdaptee implements DogAdaptee{


    @Override
    public void wang() {
        // TODO Auto-generated method stub
        
        System.out.println("汪汪叫");
    }

}
复制代码

DogAdaptee

public interface DogAdaptee {

    public abstract void wang();

}

Client

复制代码
public class Client {
    public static void main(String[] args) {
        //适配器
        Adapter adapter = (Adapter) XMLUtil.getBean("adapterPattern");
 
        //目标类通过适配器调用适配者方法
        CatTarget concreteCatTarget = (ConcreteCatTarget) XMLUtil.getBean("adapterPatternTarger");
        adapter.setCattarget(concreteCatTarget);
        adapter.wang();
 
        //适配者通过适配器调用目标类方法
        DogAdaptee concreteDogAdaptee = (ConcreteDogAdaptee) XMLUtil.getBean("adapterPatternAdaptee");
        adapter.setDogAdaptee(concreteDogAdaptee);
        adapter.catchMouse();
    }
}
 
复制代码

C++代码

复制代码
#include<iostream>
#include<string>
#include"tinyxml2.h"
using namespace std;
using namespace tinyxml2;
class  CatTarget {
public: virtual void catchMouse() = 0;
};

class ConcreteCatTarget:public CatTarget {

public: void catchMouse() {
        cout<<"抓老鼠"<<endl;
    }
};

class DogAdaptee {
public: virtual void wang()=0;
};
class ConcreteDogAdaptee:public DogAdaptee {
public: void wang() {
        cout<<"汪汪叫"<<endl;
    }
};

class Adapter:public CatTarget,public DogAdaptee {

private: CatTarget *catTarget;
         DogAdaptee *dogAdaptee;

public:
    Adapter() {
    }

    void setCatTarget(CatTarget *catTarget) {
        this->catTarget = catTarget;
    }

    void setDogAdaptee(DogAdaptee *dogAdaptee) {
        this->dogAdaptee = dogAdaptee;
    }

    void catchMouse() {
        cout<<"猫学狗叫,即目标类调用适配者中的方法:"<<endl;
        dogAdaptee->wang();

    }

    void wang(){
        cout<<"狗学猫抓老鼠,即适配者调用目标类中的方法:"<<endl;
        catTarget->catchMouse();
    }

};
int  main() {
        //适配器
        Adapter *adapter=new Adapter();
    //    XMLDocument xml;
    //    xml.LoadFile("config.xml");
    //    XMLElement *category = xml.RootElement();
    //    XMLElement *con = category->FirstChildElement("className");

        //cout << "13233";
        //目标类通过适配器调用适配者方法
    //    XMLElement* adp = con->FirstChildElement();
    //    XMLElement *next1 = adp->NextSiblingElement();
        adapter->setCatTarget(new ConcreteCatTarget());
        adapter->wang();
    //    cout << next1->GetText() << endl;
        //适配者通过适配器调用目标类方法
    //    XMLElement *next2 = next1->NextSiblingElement();
        adapter->setDogAdaptee(new ConcreteDogAdaptee());
        adapter->catchMouse();
    }
复制代码

 

posted @   好吗,好  阅读(1290)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示