**定義**:將抽象和實現解耦,使得兩者之間可以獨立的變化。

Abstract抽象化角色
---|主要職責是定義出該角色的行為,同時保存一個對實現化角色的引用。該角色一般是抽象類
Implementor實現化角色
---|他是接口或者抽象類,定義角色必須的行為和屬性
RefinedAbstraction修正抽象化角色
---|它引用實現化角色對抽象化角色進行修正
ConcreteImplementor具體實現化角色
---|它實現接口或抽象類定義的方法和屬性
------抽象角色引用實現角色,或者說抽象角色的部分實現是引用實現角色來完成的。
橋梁模式使用了類間的聚合關系、繼承、覆寫等常用功能
~~~
public class BridgeTest {
public static void main(String[] args) {
//定義一個實現化角色
Implementor imp = new ConcreteImplementor1();
//定義一個抽象化角色
Abstract abs = new RefinedAbstraction(imp);
abs.request();
}
}
/**
* 實現化角色
* 定義要實現的方法
* @author admin
*
*/
interface Implementor{
//基本方法
public void doSomething();
public void doAnything();
}
/**
* 具體實現化角色
* @author admin
*/
class ConcreteImplementor1 implements Implementor{
@Override
public void doSomething() {
System.out.println("具體實現化1,doSomething");
}
@Override
public void doAnything() {
System.out.println("具體實現化1,doAnything");
}
}
/**
* 具體實現化角色
* @author admin
*/
class ConcreteImplementor2 implements Implementor{
@Override
public void doSomething() {
System.out.println("具體實現化2,doSomething");
}
@Override
public void doAnything() {
System.out.println("具體實現化2,doAnything");
}
}
/**
* 抽象角色,定義該角色的行為,保存一個實現化角色的引用
* @author admin
*
*/
abstract class Abstract{
//定義對實現化角色的引用
private Implementor imp;
//約束子類必須去實現該構造函數
public Abstract(Implementor imp){
this.imp = imp;
}
//自身的行為和屬性
public void request(){
this.imp.doSomething();
}
//得到實現化角色
public Implementor getImp(){
return this.imp;
}
}
/**
* 具體抽象化角色
* @author admin
*
*/
class RefinedAbstraction extends Abstract{
//覆寫構造函數
public RefinedAbstraction(Implementor imp) {
super(imp);
}
//修正父類的行為
@Override
public void request() {
super.request();
super.getImp().doAnything();
}
}
~~~
## 一個例子:
一個商人,開了兩家公司,一家專門做正規的產品,另一家做能掙錢的(不管正不正規)產品。
因此,當市場上那些可以盈利,他都會立馬轉型去做這個東西。但是公司內部人員不會改變。
如何解決公司在不用改變內部結構的前提下,實現公司的轉型呢?這就需要一個橋梁來連接。

~~~
public class BridgeT {
public static void main(String[] args) {
//創建產品對象
House house = new House();
//創建出公司對象
Corp houseCorp = new HouseCorp(house);
houseCorp.makeMoney();
}
}
/**
* 抽象的公司類,
* 定義每個子公司需要實現的方法。
* 同時保存對實現化類的引用
* @author admin
*/
abstract class Corp{
private Product product;
//對實現化類的引用
public Corp(Product product) {
this.product = product;
}
//公司主要的目的是賺錢
public void makeMoney(){
//現生產商品
this.product.beProducted();
//再做銷售
this.product.beSell();
}
}
/**
* 具體的公司實現類,實現對實現化類的引用
* @author admin
*
*/
class HouseCorp extends Corp{
public HouseCorp(Product product) {
super(product);
}
@Override
public void makeMoney() {
//不該變公司的策略
super.makeMoney();
System.out.println("房地產公司賺大錢了。。。");
}
}
/**
* 抽象類,具體子公司要實現的方法
* @author admin
*
*/
abstract class Product{
//產品銷售
public abstract void beSell();
//產品生產
public abstract void beProducted();
}
/**
* 具體的產品實現類
* @author admin
*/
class House extends Product{
@Override
public void beSell() {
System.out.println("房子是這樣賣出去的...");
}
@Override
public void beProducted() {
System.out.println("房子是這樣生產的...");
}
}
~~~
**橋梁模式的優點:**
---|抽象和實現分離
---|優秀的擴充能力
---|實現細節對客戶透明。
**橋梁模式的使用場景**
---|不希望或不適用使用繼承的場景
---|接口或抽象類不穩定的場景
---|重用性要求較高的場景
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式