發表文章

目前顯示的是有「Design-Pattern」標籤的文章

[Design-Pattern] Observer Pattern

Observer Pattern - 觀察者模式 目的 : 處理一個物件對應多個物件之間的連動關係。類似 Mqtt sub/pub 當一個觀察者物件(Subject)改變時,其他的觀察者物件(Observer)都會收到通知,並執行對應的動作。 善用抽象類別 Subject public abstract class Subject { protected List<Adventurer> adventurers = new List<Adventurer>(); public void add(Adventurer adventurer) { Console.WriteLine($"{adventurer.Name} subscribe the topic!"); adventurers.Add(adventurer); } public void remove(Adventurer adventurer) { adventurers.Remove(adventurer); } public abstract void sendQuestion(string msg); } Association public class Association : Subject { public override void sendQuestion(string msg) { foreach (var adventurer in adventurers) { adventurer.getQuestions(msg); } } } Adventurer public abstract class Adventurer { public string Name; public ...

[Design-Pattern] Decorator Pattern

Decorator Pattern - 裝飾模型 Decorator Pattern 也可以稱作 Wrapper Patter。 優點 1. 動態新增功能至已存在的類別 2. 另一種子類別(抽象類別) 3. 支援開閉原則 何時去使用 1. 大型系統(Legacy System) 2. 控制項(Controller) 3. Sealed Class 介面 public interface ICar { double GetCost(); string GetName(); } 被裝飾者類別 (Component) public class Car:ICar { public double GetCost() { return 600000; } public string GetName() { return "Car"; } } 抽象類別 public abstract class DecoratorAccessoryCar : ICar { private readonly ICar _car; public DecoratorAccessoryCar(ICar car) { this._car = car; } public virtual double GetCost() { return this._car.GetCost(); } public virtual string GetName() { return this._car.GetName(); } } 裝飾類別 (Decorator) public class BasicAccessories : DecoratorAccessoryCar { ...

[Design-Pattern] Strategy

策略模式 - Strategy Pattern 目的 : 將各種可以互換的演算法(策略)包裝成一個類別 排序策略 父類別 先宣告一個父類別 public enum Color { Black, White, Blue, Gray, Red } public class Car { public readonly int Price; public readonly Color CarColor; public Car(int price, Color color) { this.Price = price; this.CarColor = color; } public override string ToString() { return $"Price : {Price}, Color : {CarColor}"; } } 繼承 Comparer 透過繼承範型的 Comparer ,來實作排序演算法。 public class SortByColor : Comparer<Car> { public override int Compare(Car o1, Car o2) { if (o1 == null || o2 == null) throw new ArgumentNullException(); return (o1.CarColor > o2.CarColor) ? 1 : (o1.CarColor == o2.CarColor) ? 0 : -1; } } public class SortCarByPrice : Comparer<Car> { public ove...

[Design-Pattern] Abstract Factory Pattern

抽象工廠 - Abstract Factory 目的 : 用一個工廠介面來生產一系列相關的產物,但實際建立那些物件由實作工廠的子類別來實現 建立抽象工廠(抽象類別) public enum CarColor { White, Black, Blue, Gray } public enum CarType { Sedan, Coupe, Wagon, Suv, Convertible, HatchBack, Limousine, Van } public abstract class Car { private CarColor _carColor; private CarType _carType; public abstract void Display(); public abstract void SetCarColor(CarColor color); public abstract void SetCarType(CarType type); public CarColor Color { get => this._carColor; set => this._carColor = value; } public CarType CTYPE { set => this._carType = value; get => this._carType; } } 實作抽象工廠 public class Honda : Car { private static string Vendor = "Honda"; public Honda() ...

[Design Pattern] Factory

工廠模式 - Factory 提供一個工廠介面,藉由工廠介面,將產生實體的功能,交由子類別各自實現。 設計一個簡易的汽車工廠介面 設計一個汽車工廠介面,該工廠會設定汽車的品牌名與車子的速度 public interface ICar { string Vendor(); int Speed(); } 產物(類別)繼承工廠,並實作其特性 汽車由工廠介面,來分別實作其特性。 public class Honda : ICar { public string Vendor() { return "Honda"; } public int Speed() { return 100; } } ... public class Toyota : ICar { public string Vendor() { return "Toyota"; } public int Speed() { return 80; } } 設計工廠中心介面 設計工廠中心介面,由該工廠來生產汽車模型。 public interface ICarFactory { ICar CarMake(); } 各產線,各自生產 各產線取得車子的模型後,各自生產自己的車子。 public class CarMadeHonda : ICarFactory { public ICar CarMake() { return new Honda(); } } public class CarMadeToyota : ICarFactory { public ICar Ca...

[Design Pattern] Simple Factory

簡單工廠模式 - Simple Factory 可以根據所傳入的不同參數,取得不同的類別物件。 靜態工廠模式 共同的父類別 自訂介面 Interface public Interface IFactory { string GetType(); } 實作繼承的各產物 public class Honda : IFactory { private readonly string _vendor; public Honda(string vendor) { this._vendor = vendor; } public string GetType() { Console.WriteLine($"Vendor : {this._vendor}"); return _vendor; } } public class Toyota : IFactory { private readonly string _vendor; public Toyota(string vendor) { this._vendor = vendor; } public string GetType() { Console.WriteLine($"Vendor : {this._vendor}"); return _vendor; } } 產物 透過簡單工廠方法,將從工廠自動將產物生產出。 public class CarFactory { public static IFactory carFactory(string type) { switch (type) { case ...

[Design Pattern] Singleton

單例模式 - Singleton 保證一個類別只會產生一個物件,而且要提供存取該物件的統一方法。 Greed Singleton - not thread-safe /* Bad Code, Not use */ public class SingletonGreed { private static SingletonGreed instance = new SingletonGreed(); private SingletonGreed() { Console.WriteLine("I am Greed Singleton!"); } public static SingletonGreed getInstance() { return instance; } } Singleton - thread-safe public class SingletonGreedSafeThread { private static SingletonGreedSafeThread instance = null; private static readonly Object _lock = new Object(); private SingletonGreedSafeThread() { Console.WriteLine("I am Safe Thread Greed Singleton!"); } public static SingletonGreedSafeThread Instance { get { lock (_lock) { if (instance == null) { ...

[Design Pattern] SOLID

SOLID S : Single Reponsiblilty Principle (SRP) 一個類別只負責一件事情 O : Open/Close Principle (OCP) 開放封閉原則。 開放表示可以擴充功能,封閉表示可以修改功能,但兩者皆不能影響原始設計的既有功能。 L : Liskov Substitution Principle (LSP) 在一個系統中,子類別應該可以替換掉父類別而不會影響系統的架構。 I : Interface Segregation Principle (ISP) 把不同的功能從介面中,分離出來。 D : Dependency Inversion Principle (DIP) 高階模組不應依賴低階模組,兩個都應該依賴在抽象概念上;抽象概念不依賴細節,而是讓細節依賴在抽象概念。