許多情況下我們需要用到攝像頭獲取圖像,進而處理圖像,這篇博文介紹利用pyqt5、OpenCV實現用電腦上連接的攝像頭拍照並保存照片。為了使用和後續開發方便,這裡利用pyqt5設計了個相機界面,後面將介紹如何實現,要點包括界面設計、邏輯實現及完整代碼。 ...
JAVA設計模式-外觀模式
介紹
外觀模式是一種結構型模式,主要是為了隱藏系統的複雜性,對外提供一個可以訪問的介面,客戶端只需要訪問這個介面即可。例如:我們現在的智能家居中的場景,平常我們下班回家,需要打開電燈,燒水、拉上窗帘、打開電視、打開空調,需要做很多事情,但是現在我們只需要回家之後在家裡控制中心中設置為回家模式,對應的相關電器會自動執行相關指令,我們不需要關註具體的每一件事情,只需要設置場景為回家模式即可。JAVA開發中的三層開發模式也體現了外觀模式。
優點
- 提高了安全性,客戶端不需要知道系統的具體實現以及內部的複雜關係。
- 降低了客戶端和子系統的耦合度,提高了靈活性,客戶端不需要隨著子系統的變化而變化,解決了客戶端和子系統的高耦合。
缺點
- 不符合"開閉原則",需要修改時比較麻煩。
角色
- Facade:外觀角色,該類知道哪些子系統負責哪些功能,其中的方法可能與一個或者多個子系統相關聯,客戶端請求傳遞到外觀角色,再傳遞到子系統。
- Subsystem:子系統,實現系統部分具體功能的類。
- Client:客戶端,負責調用外觀角色。
代碼示例
ServiceAImpl
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 服務A-打開電燈
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class ServiceAImpl {
public void funA(){
System.out.println("打開電燈");
}
}
ServiceBImpl
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 服務B-燒水
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class ServiceBImpl {
public void funB(){
System.out.println("燒水");
}
}
ServiceCImpl
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 服務C-打開電視
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class ServiceCImpl {
public void funC(){
System.out.println("打開電視");
}
}
ServiceDImpl
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 服務D-拉上窗帘
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class ServiceDImpl {
public void funD() {
System.out.println("拉上窗帘");
}
}
ServiceEImpl
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 服務E-打開空調
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class ServiceEImpl {
public void funE() {
System.out.println("打開空調");
}
}
SmartHomeFacade
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 外觀角色
* @Author: xpy
* @Date: Created in 2022年10月06日 12:12 下午
*/
public class SmartHomeFacade {
private ServiceAImpl serviceA;
private ServiceBImpl serviceB;
private ServiceCImpl serviceC;
private ServiceDImpl serviceD;
private ServiceEImpl serviceE;
public SmartHomeFacade() {
this.serviceA = new ServiceAImpl();
this.serviceB = new ServiceBImpl();
this.serviceC = new ServiceCImpl();
this.serviceD = new ServiceDImpl();
this.serviceE = new ServiceEImpl();
}
public void goHome(){
System.out.println("回家模式");
serviceA.funA();
serviceB.funB();
serviceC.funC();
serviceD.funD();
serviceE.funE();
}
public void rest(){
System.out.println("放鬆模式");
serviceC.funC();
serviceD.funD();
serviceE.funE();
}
}
Client
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.adapter.facade
* @Description: 客戶端
* @Author: xpy
* @Date: Created in 2022年10月06日 12:19 下午
*/
public class Client {
public static void main(String[] args) {
SmartHomeFacade smartHomeFacade = new SmartHomeFacade();
smartHomeFacade.goHome();
System.out.println("===============");
smartHomeFacade.rest();
}
}
運行結果
擴展
開閉原則
"開閉原則"是在面向對象編程的領域中,規定“軟體中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的”,這意味著一個實體是允許在不改變它的源代碼的前提下變更它的行為。
原文鏈接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---wai-guan-mo-shi