如何設計好的網(wǎng)頁杭州網(wǎng)站seo外包
上一篇《適配器模式》? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?下一篇《裝飾器模式》
簡介:
橋接模式,它是一種結(jié)構(gòu)型設計模式,它的主要目的是將抽象部分與具體實現(xiàn)部分分離,使它們都可以獨立地變化。橋接模式通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責,從而把抽象(Abstraction)與行為實現(xiàn)(Implementation)分離開來,以保持各部分的獨立性以及應對他們的功能擴展。
橋接模式的結(jié)構(gòu)包括以下主要角色:
1、抽象類(AbstractClass):定義了抽象接口,并實現(xiàn)了部分功能。
2、具體實現(xiàn)類(ConcreteClass):實現(xiàn)了抽象類所定義的具體接口,完成抽象類的功能實現(xiàn)。
3、橋接類(BridgeClass):將抽象類和具體實現(xiàn)類連接起來,使得它們可以獨立地變化。
橋接模式的使用場景:
1、系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系。此時,可以通過橋接模式使他們在抽象層建立一個關聯(lián)關系。
2、系統(tǒng)不希望使用繼承或因為多層次繼承導致系統(tǒng)類的個數(shù)急劇增加時。
3、一個類存在兩個獨立變化的維度,而這兩個維度都需要進行擴展。
橋接模式的創(chuàng)建步驟:
1、創(chuàng)建抽象類(AbstractClass),它定義了抽象接口,并實現(xiàn)了部分功能。
2、創(chuàng)建具體實現(xiàn)類(ConcreteClass),它實現(xiàn)了抽象類所定義的具體接口,完成抽象類的功能實現(xiàn)。
3、創(chuàng)建橋接類(BridgeClass),它將抽象類和具體實現(xiàn)類連接起來,使得它們可以獨立地變化。
橋接模式的優(yōu)點,主要包括:
1、分離抽象及其實現(xiàn)部分:橋接模式通過將抽象部分與實現(xiàn)部分分離,使得它們可以獨立地變化。這種分離有助于降低對實現(xiàn)部分編譯時刻的依賴性,當改變一個實現(xiàn)類時,并需要重新編譯抽象類和它的客戶程序。同時,接口與實現(xiàn)分離有助于分層,從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng),系統(tǒng)的高層部分僅需知道抽象類和具體實現(xiàn)類即可。
2、提高可擴充性:橋接模式使得抽象類和具體實現(xiàn)類可以獨立地變化,因此可以獨立地對它們進行擴展。這種擴展能力有助于提高系統(tǒng)的可維護性和可重用性。
3、優(yōu)秀的擴展能力:橋接模式使得抽象類和具體實現(xiàn)類可以獨立地變化,因此可以靈活地添加新的具體實現(xiàn)類,以滿足新的需求。這種擴展能力使得系統(tǒng)能夠適應未來的變化和發(fā)展。
總之,橋接模式通過將抽象部分與實現(xiàn)部分分離,提高了系統(tǒng)的可維護性、可重用性和可擴展性,同時降低了系統(tǒng)的復雜性。
橋接模式的缺點,主要包括:
1、增加了系統(tǒng)的理解和設計難度。由于關聯(lián)關系建立在抽象層,要求開發(fā)者一開始就針對抽象層進行設計與編程,正確識別出系統(tǒng)中兩個獨立變化的維度并不容易。
2、可能增加系統(tǒng)的復雜性。對于一些不希望使用繼承或因為多層繼承導致系統(tǒng)類的個數(shù)劇增的場景,可能需要考慮使用橋接模式,這會增加系統(tǒng)的復雜性和理解難度。
總之,橋接模式雖然可以提高系統(tǒng)的可維護性、可重用性和可擴展性,但也增加了系統(tǒng)的復雜性和理解難度。因此,在使用橋接模式時需要權(quán)衡其優(yōu)缺點,根據(jù)實際需求進行選擇。
示例:
一、C#橋接模式
以下是一個示例,展示了如何在C#中實現(xiàn)橋接模式:
using System; ?namespace BridgePatternExample ?
{ ?// 抽象類 ?public abstract class Abstraction ?{ ?protected Implementor implementor; ?public void SetImplementor(Implementor implementor) ?{ ?this.implementor = implementor; ?} ?public abstract void Operation(); ?} ?// 具體實現(xiàn)類 ?public class ConcreteAbstraction : Abstraction ?{ ?public override void Operation() ?{ ?implementor.Operation(); ?} ?} ?// 實現(xiàn)接口 ?public interface Implementor ?{ ?void Operation(); ?} ?// 具體實現(xiàn)類1 ?public class ConcreteImplementor1 : Implementor ?{ ?public void Operation() ?{ ?Console.WriteLine("Concrete Implementor 1 operation"); ?} ?} ?// 具體實現(xiàn)類2 ?public class ConcreteImplementor2 : Implementor ?{ ?public void Operation() ?{ ?Console.WriteLine("Concrete Implementor 2 operation"); ?} ?}class Program ?{ ?static void Main(string[] args) ?{ ?Abstraction abstraction = new ConcreteAbstraction(); ?abstraction.SetImplementor(new ConcreteImplementor1()); // 第一個實現(xiàn)類操作 ?abstraction.Operation(); // 輸出 "Concrete Implementor 1 operation" ?abstraction.SetImplementor(new ConcreteImplementor2()); // 第二個實現(xiàn)類操作 ?abstraction.Operation(); // 輸出 "Concrete Implementor 2 operation" ?} ??} ??
}
二、java橋接模式
橋接模式通常通過以下方式實現(xiàn):
// 抽象類 ?
public abstract class AbstractClass { ?protected Implementor implementor; ?public void setImplementor(Implementor implementor) { ?this.implementor = implementor; ?} ?public abstract void operation(); ?
} ?// 具體實現(xiàn)類 ?
public class ConcreteClass extends AbstractClass { ?@Override ?public void operation() { ?implementor.operation(); ?} ?
} ?// 實現(xiàn)接口 ?
public interface Implementor { ?void operation(); ?
} ?// 具體實現(xiàn)類1 ?
public class ConcreteImplementor1 implements Implementor { ?@Override ?public void operation() { ?System.out.println("Concrete Implementor 1 operation"); ?} ?
} ?// 具體實現(xiàn)類2 ?
public class ConcreteImplementor2 implements Implementor { ?@Override ?public void operation() { ?System.out.println("Concrete Implementor 2 operation"); ?} ?
}//在客戶端中創(chuàng)建上下文對象并注入具體策略對象
public class Main { ?public static void main(String[] args) { ?AbstractClass abstraction = new ConcreteClass(); ?abstraction.setImplementor(new ConcreteImplementor1()); // 第一個實現(xiàn)類操作 ?abstraction.operation(); // 輸出 "Concrete Implementor 1 operation" ?abstraction.setImplementor(new ConcreteImplementor2()); // 第二個實現(xiàn)類操作 ?abstraction.operation(); // 輸出 "Concrete Implementor 2 operation"}
}
三、javascript橋接模式
在JavaScript中,橋接實現(xiàn)方式如下:
// 抽象類 ?
class AbstractClass { ?constructor(bridge) { ?this.bridge = bridge; ?} ?operation() { ?this.bridge.implementationOperation(); ?} ?
} ?// 具體實現(xiàn)類 ?
class ConcreteClass1 { ?implementationOperation() { ?console.log('ConcreteClass1 operation'); ?} ?
} ?class ConcreteClass2 { ?implementationOperation() { ?console.log('ConcreteClass2 operation'); ?} ?
} ?// 橋接類 ?
class BridgeClass extends AbstractClass { ?constructor(implementation) { ?super(implementation); ?} ?
}const bridge1 = new BridgeClass(new ConcreteClass1()); ?
const bridge2 = new BridgeClass(new ConcreteClass2()); ?bridge1.operation(); // 輸出 "ConcreteClass1 operation" ?
bridge2.operation(); // 輸出 "ConcreteClass2 operation"
四、C++橋接模式
以下是在C++中實現(xiàn)橋接模式:
#include <iostream> ?// 抽象類 ?
class AbstractClass { ?
public: ?virtual void operation() = 0; ?
}; ?// 具體實現(xiàn)類1 ?
class ConcreteClass1 : public AbstractClass { ?
public: ?void operation() override { ?std::cout << "ConcreteClass1 operation" << std::endl; ?} ?
}; ?// 具體實現(xiàn)類2 ?
class ConcreteClass2 : public AbstractClass { ?
public: ?void operation() override { ?std::cout << "ConcreteClass2 operation" << std::endl; ?} ?
}; ?// 橋接類 ?
class BridgeClass { ?
public: ?AbstractClass* abstract; ?BridgeClass(AbstractClass* a) : abstract(a) {} ?void operation() { abstract->operation(); } ?
}; ?int main() { ?AbstractClass* a = new ConcreteClass1(); // 使用具體實現(xiàn)類1創(chuàng)建抽象類的對象 ?BridgeClass b(a); // 使用橋接類與抽象類的對象進行交互 ?b.operation(); // 輸出 "ConcreteClass1 operation" ?delete a; // 釋放內(nèi)存 ?a = new ConcreteClass2(); // 使用具體實現(xiàn)類2創(chuàng)建抽象類的對象 ?b.operation(); // 輸出 "ConcreteClass2 operation" ?delete a; // 釋放內(nèi)存 ?return 0; ?
}
五、python橋接模式
以下是在python中實現(xiàn)橋接模式:
from abc import ABC, abstractmethod ?# 抽象類 ?
class AbstractClass(ABC): ?@abstractmethod ?def operation(self): ?pass ?# 具體實現(xiàn)類1 ?
class ConcreteClass1(AbstractClass): ?def operation(self): ?print("ConcreteClass1 operation") ?# 具體實現(xiàn)類2 ?
class ConcreteClass2(AbstractClass): ?def operation(self): ?print("ConcreteClass2 operation") ?# 橋接類 ?
class BridgeClass: ?def __init__(self, abstract_class): ?self.abstract_class = abstract_class ?def operation(self): ?self.abstract_class.operation() ?# 使用示例: ?
bridge1 = BridgeClass(ConcreteClass1()) ?
bridge2 = BridgeClass(ConcreteClass2()) ?
bridge1.operation() # 輸出 "ConcreteClass1 operation" ?
bridge2.operation() # 輸出 "ConcreteClass2 operation"
六、go橋接模式
以下是一個示例,展示了如何在go中實現(xiàn)橋接模式:
package main ?import "fmt" ?// 抽象類 ?
type AbstractClass struct { ?BridgeClass ?
} ?func (ac *AbstractClass) Operation() { ?ac.BridgeClass.Operation() ?
} ?// 具體實現(xiàn)類1 ?
type ConcreteClass1 struct{} ?func (cc1 *ConcreteClass1) Operation() { ?fmt.Println("ConcreteClass1 operation") ?
} ?// 具體實現(xiàn)類2 ?
type ConcreteClass2 struct{} ?func (cc2 *ConcreteClass2) Operation() { ?fmt.Println("ConcreteClass2 operation") ?
} ?// 橋接類 ?
type BridgeClass struct { ?impl interface{} ?
} ?func (bc *BridgeClass) Operation() { ?bc.impl.Operation() ?
} ?func main() { ?abstract := &AbstractClass{&BridgeClass{&ConcreteClass1{}}} ?abstract.Operation() // 輸出 "ConcreteClass1 operation" ?abstract.BridgeClass.impl = &ConcreteClass2{} ?abstract.Operation() // 輸出 "ConcreteClass2 operation" ?
}
七、PHP橋接模式
以下是一個示例,展示了如何在PHP中實現(xiàn)橋接模式:
<?php ?// 抽象類 ?
abstract class AbstractClass { ?protected $bridge; ?public function __construct(BridgeClass $bridge) { ?$this->bridge = $bridge; ?} ?abstract public function operation(); ?
} ?// 具體實現(xiàn)類1 ?
class ConcreteClass1 implements AbstractClass { ?public function operation() { ?echo "ConcreteClass1 operation\n"; ?} ?
} ?// 具體實現(xiàn)類2 ?
class ConcreteClass2 implements AbstractClass { ?public function operation() { ?echo "ConcreteClass2 operation\n"; ?} ?
} ?// 橋接類 ?
class BridgeClass { ?protected $implementation; ?public function __construct(Implementation $implementation) { ?$this->implementation = $implementation; ?} ?public function operation() { ?$this->implementation->operation(); ?} ?
} ?// 使用示例: ?
$bridge1 = new BridgeClass(new ConcreteClass1()); ?
$bridge2 = new BridgeClass(new ConcreteClass2()); ?
$bridge1->operation(); // 輸出 "ConcreteClass1 operation" ?
$bridge2->operation(); // 輸出 "ConcreteClass2 operation"
《完結(jié)》
上一篇《適配器模式》? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?下一篇《裝飾器模式》 ? ? ? ? ?