佛山外貿(mào)網(wǎng)站建設(shè)方案友鏈交易交易平臺
引言
設(shè)計模式是軟件工程中用于解決常見問題的可復(fù)用解決方案。在C#編程中,常見的設(shè)計模式具有廣泛的應(yīng)用。本篇博客將重點介紹C#中常見的結(jié)構(gòu)型設(shè)計模式,包括適配器模式、裝飾器模式、代理模式、組合模式和享元模式。
目錄
- 引言
- 1. 適配器模式(Adapter Pattern)
- 示例代碼
- 解釋
- 2. 橋接模式(Bridge Pattern)
- 示例代碼
- 解釋
- 3. 外觀模式(Facade)
- 示例代碼
- 解釋
- 4. 裝飾器模式(Decorator Pattern)
- 示例代碼
- 解釋
- 5. 代理模式(Proxy Pattern)
- 示例代碼
- 解釋
- 6. 組合模式(Composite Pattern)
- 示例代碼
- 解釋
- 7. 享元模式(Flyweight Pattern)
- 示例代碼
- 解釋
- 結(jié)論
1. 適配器模式(Adapter Pattern)
適配器模式用于將一個類的接口轉(zhuǎn)換成客戶端所期望的另一個接口。這種模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
示例代碼
// 目標(biāo)接口
interface ITarget
{void Request();
}// 需要被適配的類
class Adaptee
{public void SpecificRequest(){Console.WriteLine("Adaptee's SpecificRequest");}
}// 適配器類
class Adapter : ITarget
{private Adaptee _adaptee;public Adapter(Adaptee adaptee){_adaptee = adaptee;}public void Request(){_adaptee.SpecificRequest();}
}// 客戶端代碼
class Client
{static void Main(string[] args){Adaptee adaptee = new Adaptee();ITarget target = new Adapter(adaptee);target.Request();}
}
解釋
適配器模式中的目標(biāo)接口(ITarget
)定義了客戶端所期望的方法。Adaptee
類是需要被適配的類,其中包含了一個SpecificRequest
方法。Adapter
類則是適配器,持有一個Adaptee
對象的引用,并實現(xiàn)了ITarget
接口。在Adapter
的Request
方法中,調(diào)用了Adaptee
的SpecificRequest
方法。在客戶端代碼中,創(chuàng)建了一個Adaptee
對象和一個Adapter
對象,然后通過Adapter
對象去調(diào)用Request
方法。
2. 橋接模式(Bridge Pattern)
橋接模式是一種結(jié)構(gòu)型設(shè)計模式,用于將抽象與實現(xiàn)隔離開來,使它們能夠獨立變化。它通過組合的方式代替繼承,從而降低了系統(tǒng)的耦合性。該模式適合在需要多個維度進行擴展時使用,例如在圖形界面庫中,將窗口與不同操作系統(tǒng)的窗口裝飾風(fēng)格進行分離。橋接模式的核心思想是將抽象部分與實現(xiàn)部分分離,使它們可以獨立地變化和演化。
示例代碼
// 實現(xiàn)部分接口
interface Implementor {void operationImpl();
}// 具體實現(xiàn)類A
class ConcreteImplementorA implements Implementor {@Overridepublic void operationImpl() {System.out.println("ConcreteImplementorA operation implementation");}
}// 具體實現(xiàn)類B
class ConcreteImplementorB implements Implementor {@Overridepublic void operationImpl() {System.out.println("ConcreteImplementorB operation implementation");}
}// 抽象部分
abstract class Abstraction {protected Implementor implementor;public void setImplementor(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}// 擴展抽象部分的具體類
class RefinedAbstraction extends Abstraction {@Overridepublic void operation() {implementor.operationImpl();}
}// 使用示例
public class BridgePatternExample {public static void main(String[] args) {Implementor implementorA = new ConcreteImplementorA();Implementor implementorB = new ConcreteImplementorB();Abstraction abstraction = new RefinedAbstraction();abstraction.setImplementor(implementorA);abstraction.operation();abstraction.setImplementor(implementorB);abstraction.operation();}
}
解釋
在上述示例中,?Implementor? 接口定義了實現(xiàn)部分的操作方法。?ConcreteImplementorA? 和ConcreteImplementorB? 是具體的實現(xiàn)類。?Abstraction? 是抽象部分的定義,其中包含一個實現(xiàn)部分的通用接口,并有一個抽象方法 ?operation()? 來定義具體的操作。?RefinedAbstraction? 是具體的擴展抽象類,實現(xiàn)了抽象方法并通過組合關(guān)聯(lián)了具體的實現(xiàn)類。
3. 外觀模式(Facade)
外觀模式是一種結(jié)構(gòu)型設(shè)計模式,提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀模式定義了一個高層接口,讓子系統(tǒng)更容易使用。。
示例代碼
// 子系統(tǒng)A
class SubsystemA {public void operationA() {System.out.println("SubsystemA operation");}
}// 子系統(tǒng)B
class SubsystemB {public void operationB() {System.out.println("SubsystemB operation");}
}// 子系統(tǒng)C
class SubsystemC {public void operationC() {System.out.println("SubsystemC operation");}
}// 外觀類
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void operation() {subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}// 使用示例
public class FacadePatternExample {public static void main(String[] args) {Facade facade = new Facade();facade.operation();}
}
解釋
在上述示例中,?SubsystemA?、?SubsystemB? 和 ?SubsystemC? 是不同的子系統(tǒng),它們分別提供了不同的操作。?Facade? 是外觀類,隱藏了子系統(tǒng)的復(fù)雜性,為客戶端提供了一個簡單的接口。在外觀類的操作方法中,調(diào)用了多個子系統(tǒng)的操作。
4. 裝飾器模式(Decorator Pattern)
裝飾器模式允許向一個現(xiàn)有對象添加新功能,同時又不改變其結(jié)構(gòu)。它是通過創(chuàng)建一個包裝對象來包裹真實對象,從而對真實對象進行功能的擴展。
示例代碼
// 抽象組件接口
interface IComponent
{void Operation();
}// 具體組件類
class ConcreteComponent : IComponent
{public void Operation(){Console.WriteLine("ConcreteComponent's Operation");}
}// 抽象裝飾者類
abstract class Decorator : IComponent
{protected IComponent _component;public Decorator(IComponent component){_component = component;}public virtual void Operation(){_component.Operation();}
}// 具體裝飾者類
class ConcreteDecoratorA : Decorator
{public ConcreteDecoratorA(IComponent component): base(component){}public override void Operation(){base.Operation();AddedBehavior();}private void AddedBehavior(){Console.WriteLine("ConcreteDecoratorA's AddedBehavior");}
}class ConcreteDecoratorB : Decorator
{public ConcreteDecoratorB(IComponent component): base(component){}public override void Operation(){base.Operation();AddedBehavior();}private void AddedBehavior(){Console.WriteLine("ConcreteDecoratorB's AddedBehavior");}
}// 客戶端代碼
class Client
{static void Main(string[] args){IComponent component = new ConcreteComponent();component = new ConcreteDecoratorA(component);component = new ConcreteDecoratorB(component);component.Operation();}
}
解釋
裝飾器模式中的抽象組件接口(IComponent
)定義了被裝飾者和裝飾者之間的公共方法。ConcreteComponent
類是具體的組件類,實現(xiàn)了IComponent
接口的Operation
方法。Decorator
類是抽象裝飾者類,持有一個IComponent
對象的引用,并實現(xiàn)了IComponent
接口。ConcreteDecoratorA
和ConcreteDecoratorB
類分別是具體裝飾者類,它們繼承自Decorator
類,并在調(diào)用父類Operation
方法的同時添加了額外的行為。
在客戶端代碼中,首先創(chuàng)建了一個ConcreteComponent
對象,然后通過多次進行裝飾,分別使用ConcreteDecoratorA
和ConcreteDecoratorB
對其進行包裝。最后調(diào)用component.Operation()
方法時,實際上會調(diào)用被裝飾者的Operation
方法,并在其基礎(chǔ)上添加了額外的行為。
5. 代理模式(Proxy Pattern)
代理模式為其他對象提供一種代理以控制對這個對象的訪問。代理模式主要通過代理類來封裝目標(biāo)對象,控制客戶端對目標(biāo)對象的訪問,并在必要的時候進行一些預(yù)處理或后處理操作。
示例代碼
// 被代理接口
interface ISubject
{void Request();
}// 真實對象類
class RealSubject : ISubject
{public void Request(){Console.WriteLine("RealSubject's Request");}
}// 代理類
class Proxy : ISubject
{private RealSubject _realSubject;public void Request(){if (_realSubject == null){_realSubject = new RealSubject();}PreProcess();_realSubject.Request();PostProcess();}private void PreProcess(){Console.WriteLine("Proxy's PreProcess");}private void PostProcess(){Console.WriteLine("Proxy's PostProcess");}
}// 客戶端代碼
class Client
{static void Main(string[] args){ISubject proxy = new Proxy();proxy.Request();}
}
解釋
代理模式中的被代理接口(ISubject
)定義了代理對象和真實對象的公共方法。RealSubject
類是真實對象類,實現(xiàn)了被代理接口的Request
方法。Proxy
類是代理類,持有一個RealSubject
對象的引用,并實現(xiàn)了被代理接口的Request
方法。在Proxy
類的Request
方法中,進行了預(yù)處理、調(diào)用真實對象的Request
方法和后處理。
在客戶端代碼中,創(chuàng)建了一個代理對象Proxy
,然后通過該對象調(diào)用Request
方法。在調(diào)用過程中,會對真實對象進行實例化,并在方法執(zhí)行前后進行相應(yīng)的預(yù)處理和后處理。
6. 組合模式(Composite Pattern)
組合模式將對象組合成樹形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。組合模式使得客戶端對單個對象和組合對象的使用具有一致性。
示例代碼
// 抽象組件類
abstract class Component
{protected string _name;public Component(string name){_name = name;}public abstract void Display();
}// 葉子節(jié)點類
class Leaf : Component
{public Leaf(string name): base(name){}public override void Display(){Console.WriteLine(_name);}
}// 容器節(jié)點類
class Composite : Component
{private List<Component> _children = new List<Component>();public Composite(string name): base(name){}public void Add(Component component){_children.Add(component);}public void Remove(Component component){_children.Remove(component);}public override void Display(){Console.WriteLine(_name);foreach (Component component in _children){component.Display();}}
}// 客戶端代碼
class Client
{static void Main(string[] args){Composite root = new Composite("root");Leaf leaf1 = new Leaf("leaf1");Leaf leaf2 = new Leaf("leaf2");Composite composite1 = new Composite("composite1");Composite composite2 = new Composite("composite2");root.Add(leaf1);root.Add(composite1);composite1.Add(leaf2);composite1.Add(composite2);root.Display();}
}
解釋
組合模式中的抽象組件類(Component
)定義了樹狀結(jié)構(gòu)中所有對象的通用行為的接口。Leaf
類是葉子節(jié)點類,它繼承自Component
類,并實現(xiàn)了Display
方法。Composite
類是容器節(jié)點類,它繼承自Component
類,并持有一組Component
對象。在Composite
類的Display
方法中,首先輸出自身信息,然后遞歸調(diào)用所有子節(jié)點的Display
方法。
在客戶端代碼中,首先創(chuàng)建了一個根節(jié)點root
和一些葉子節(jié)點和容器節(jié)點。通過調(diào)用容器節(jié)點的Add
方法可以將其他節(jié)點添加到其內(nèi)部。最后調(diào)用root.Display()
方法,會遞歸地展示整個樹狀結(jié)構(gòu)。
7. 享元模式(Flyweight Pattern)
享元模式是一種池技術(shù),主要用于減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。享元模式通過共享已創(chuàng)建的對象,避免重復(fù)創(chuàng)建相同的對象。
示例代碼
// 享元接口
interface IFlyweight
{void Operation();
}// 具體享元類
class ConcreteFlyweight : IFlyweight
{private readonly string _intrinsicState;public ConcreteFlyweight(string intrinsicState){_intrinsicState = intrinsicState;}public void Operation(){Console.WriteLine($"ConcreteFlyweight's Operation with {_intrinsicState}");}
}// 享元工廠類
class FlyweightFactory
{private Dictionary<string, IFlyweight> _flyweights = new Dictionary<string, IFlyweight>();public IFlyweight GetFlyweight(string key){if (_flyweights.ContainsKey(key)){return _flyweights[key];}else{IFlyweight flyweight = new ConcreteFlyweight(key);_flyweights.Add(key, flyweight);return flyweight;}}
}// 客戶端代碼
class Client
{static void Main(string[] args){FlyweightFactory factory = new FlyweightFactory();IFlyweight flyweight1 = factory.GetFlyweight("key1");flyweight1.Operation();IFlyweight flyweight2 = factory.GetFlyweight("key2");flyweight2.Operation();IFlyweight flyweight3 = factory.GetFlyweight("key1");flyweight3.Operation();}
}
解釋
享元模式中的享元接口(IFlyweight
)定義了享元類的公共方法。ConcreteFlyweight
類是具體享元類,它實現(xiàn)了IFlyweight
接口,并持有一個內(nèi)部狀態(tài)(_intrinsicState
)。FlyweightFactory
類是享元工廠類,用于創(chuàng)建和管理享元對象。
在客戶端代碼中,首先創(chuàng)建了一個FlyweightFactory
對象。通過調(diào)用工廠的GetFlyweight
方法可以獲取享元對象,如果對象已經(jīng)存在,則直接返回已有對象;如果對象不存在,則創(chuàng)建新的享元對象并將其緩存起來。最后調(diào)用享元對象的Operation
方法時,會輸出其內(nèi)部狀態(tài)。
結(jié)論
結(jié)構(gòu)型設(shè)計模式在C#編程中具有廣泛的應(yīng)用。適配器模式用于解決不兼容接口的問題,裝飾器模式用于動態(tài)地擴展對象的功能,代理模式用于控制對對象的訪問,組合模式用于處理樹狀結(jié)構(gòu)數(shù)據(jù),享元模式用于減少對象創(chuàng)建的數(shù)量。合理使用這些結(jié)構(gòu)型設(shè)計模式可以提高代碼的可讀性、可維護性和可擴展性。
參考資料:
- Design Patterns in C#