1. 程式人生 > 其它 >西門子PLC-博圖 MODBUS-TCP測試

西門子PLC-博圖 MODBUS-TCP測試

設計模式——介面卡模式

介面卡模式是作為兩個不相容的介面之間的橋樑,這種型別的設計模式屬於結構模式,它主要作用是將一個類的介面轉換成客戶希望的另外一個介面,介面卡模式使得原本由於介面不相容而不能在一起工作的那些類可以一起工作。在網上看了各位大牛寫的介面卡模式的文章,用各種例子進行舉例的,可見介面卡模式可以解決許多介面不配的問題。我們這裡用電腦、記憶體卡、讀卡器來舉例。電腦有USB介面,記憶體卡的介面是SD匯流排模式,需要將記憶體卡插到讀卡器中再插到電腦上,供電腦讀寫記憶體卡資料。這個讀卡就是介面卡。

//定義一個USB介面
public interface Usb {
    //USb介面可以讀取資料
	public String readData();
    //Usb介面也可以寫入資料
	public void writeData(String data);
}
//計算機類
public class Computer  {
    //計算機可以通過USB介面讀取資料
	public String readData(Usb usb) {
		return usb.readData();
	}
    //計算機可以往Usb中寫入資料。
	@Override
	public void writeData(USb usb,String data) {
        usb.setData(data);
	}
}
//現在我們有一個記憶體卡
public class SdCard {
    //記憶體卡中存的資料
	private String data = "SdCard Data";
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
}
//記憶體卡是沒有Usb介面的,所以計算機不能直接讀取記憶體卡資料,這就需要我們定義一個有Usb介面的介面卡。
public class SdCardAdapter implements Usb {
	private SdCard sd;
    //建構函式傳入一個記憶體卡,相當於現實中將記憶體卡插入到讀卡器。
	public SdCardAdapter(SdCard sd) {
		this.sd = sd;
	}
    //讀卡器知道怎麼讀取記憶體卡中的資料。
	@Override
	public String readData() {
		return sd.getData();
	}
        //讀卡器往記憶體卡中寫資料。
	@Override
	public void writeData(String data) {
	    sd.setData(data);
	}
}
//呼叫示例
public class Demo(){
    public static void main(String [] args){
    //例項化記憶體卡
    SdCard sd = new SdCard();
    //例項化讀卡器。
    SdCardAdapter sdAdapter = new SdCardAdapter(sd);
    //例項化計算機
    Computer computer =new Computer();
    //計算機通過讀卡器往記憶體卡中寫入資料。
    System.out.println("Sd Card Data is " + computer.readData(sdAdapter));
    //往記憶體卡中寫入新的資料。
    computer.writeData(sdAdapter, "新寫入的資料");
    //讀取剛寫入的資料
    System.out.println("Sd Card Data is " + computer.readData(sdAdapter));
    }
}

c++的實現

//定義Usb介面
class Usb {
public:
	virtual std::string readData()=0;
	virtual void writeData(const std::string& data) =0;
};
//計算機類
class Computer {
public:
	//計算機讀取USB裝置的資料
	std::string readData(Usb& usb) {
		return usb.readData();
	}
	//計算機往USB裝置寫資料
	void writeData(Usb& usb, const std::string data) {
		usb.writeData(data);
	}
};
//記憶體卡類
class SdCard {
public:
	//讀取記憶體卡中的資料
	std::string getData() {
		return data;
	}
	//向記憶體卡中寫入資料
	void setData(const std::string data) {
		this->data = data;
	}
private:
	//記憶體卡中存放的資料
	std::string data = "預設資料";
};
//讀卡器類,實現USB介面
class SdCardAdapter : public Usb {
public:
	SdCardAdapter(SdCard* sd) {
		this->sd = sd;
	}
	//讀取記憶體卡中的資料
	std::string readData() override {
		return sd->getData();
	}
	//向記憶體卡寫入資料
	void writeData(const std::string& data) override {
		sd->setData(data);
	}
private:
	SdCard* sd;
};
int main(){
     //例項記憶體卡
    SdCard sd;
    //例項化讀卡器
    SdCardAdapter adapter(&sd);
    //例項化計算機
    Computer computer;
    //讀取記憶體卡資料
    std::cout << "Sd Card Data is :" << computer.readData(adapter) << std::endl;
    //寫入記憶體卡資料
    computer.writeData(adapter, "new Data");
    std::cout << "Sd Card Data is :" << computer.readData(adapter) << std::endl;
}

以上介面卡有一個SdCard型別的私有變數,介面卡技有記憶體卡物件,這種方式被稱為物件的介面卡模式,還有一種通過繼承實的的介面卡稱為類的介面卡模式
Java程式碼

public class SdCardAdapter2 extends SdCard implements Usb {
	@Override
	public String readData() {
		return getData();
	}
	@Override
	public void writeData(String data) {
		this.setData(data);
	}
}

C++程式碼

class SdCardAdapter2 : public Usb, SdCard {
public:
	//讀取記憶體卡中的資料
	std::string readData() override {
		return getData();
	}
	//向記憶體卡寫入資料
	void writeData(const std::string& data) override {
		setData(data);
	}
};

除了作為介面匹配來使用,在寫框架時,使用介面卡可以給使用框架的使用者更多靈活,比如android中的ListView 和RecyclerView 留給開發人員實現介面卡,從而可以讓開發人員方便的實現各種需求。
優點:
1、可以讓任何兩個沒有關聯的類一起執行。
2、提高了類的複用。
3、增加了類的透明度。
4、靈活性好。

缺點:
1、過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 A 介面,其實內部被適配成了 B 介面的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。
2.由於 JAVA 至多繼承一個類,所以至多隻能適配一個適配者類,而且目標類必須是抽象類。