在顯示樹形結構時,復合模式有很好的體現。本篇顯示如下部門結構:
以上,有的節點包含子節點,有的節點部包含子節點。不管是什麼節點,每個節點就代表一個部門。
首先設計一個關於部門的抽象基類。
public abstract class DepartmentComponent{public string Name { private set; get; }public DepartmentComponent(string name){this.Name = name;}public virtual void PrintSupervisorOf(int spacing){for (int counter = 0; counter < spacing; counter++){Console.Write(" ");}Console.WriteLine(Name);}}
以上,通過構造函數給屬性賦值,通過PrintSupervisorOf(int spacing)方法打印出節點的名稱。
接下來設計包含子節點的節點。該類維護著DepartmentComponent類型的集合,提供方法向這個集合中添加節點或從集合中刪除節點。
public class DepartmentComposite : DepartmentComponent{private IList<DepartmentComponent> employees;public DepartmentComposite(string name) : base(name){employees = new List<DepartmentComponent>();}public void AddDepartment(DepartmentComponent e){employees.Add(e);}public void RemoveDepartment(DepartmentComponent e){employees.Remove(e);}public override void PrintSupervisorOf(int spacing){base.PrintSupervisorOf(spacing);foreach (DepartmentComponent e in employees){e.PrintSupervisorOf(spacing + 1);}}}
以上 PrintSupervisorOf(int spacing)方法重寫了抽象基類的方法,不僅把本節點的名稱打印出來,還使用遞歸把所有子節點的名稱顯示出來。
最後設計部包含子節點的節點。
public class Department : DepartmentComponent{public Department(string name) : base(name){}public override void PrintSupervisorOf(int spacing){base.PrintSupervisorOf(spacing);}}
客戶端部分。
class Program{static void Main(string[] args){DepartmentComposite salesDepartment1 = new DepartmentComposite("銷售部1");Department zhangsan = new Department("張三");Department lisi = new Department("李四");DepartmentComposite salesDepartment2 = new DepartmentComposite("銷售部2");DepartmentComposite specialDepartment = new DepartmentComposite("銷售部2特別行動組");Department wangwu = new Department("王五");Department zhaoliu = new Department("趙六");DepartmentComposite salesDepartment = new DepartmentComposite("銷售部");salesDepartment.AddDepartment(salesDepartment1);salesDepartment.AddDepartment(salesDepartment2);salesDepartment1.AddDepartment(zhangsan);salesDepartment1.AddDepartment(lisi);salesDepartment2.AddDepartment(specialDepartment);specialDepartment.AddDepartment(wangwu);specialDepartment.AddDepartment(zhaoliu);salesDepartment.PrintSupervisorOf(0);Console.ReadKey();}}
1、簡單工廠模式(Simple Factory Pattern)
2、建造者模式(Builder Pattern)
3、策略(Strategy)模式
4、工廠方法模式(Factory Method Pattern)
5、抽象工廠模式(Abstract Factory)
6、命令模式(Command Pattern)
7、模版方法(Template Method)
8、單件模式(Single Pattern)
9、原型模式(Prototype Pattern)
一共23種設計模式!
按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。
創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:
工廠方法模式(Factory Method Pattern)
抽象工廠模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
單例模式(Singleton Pattern)
結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:
適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
組合模式(Composite Pattern)
裝飾者模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:
責任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
訪問者模式(Visitor Pattern)
推薦你一本好書:《軟件秘笈:設計模式那點事》,裡面講解的23中設計模式例子很生動,容易理解,還有JDK中設計模式應用情況,看了收獲挺大的!百度裡面搜“設計模式”,第一條中設計模式百度百科中就有首推該圖書,浏覽量在20幾萬以上的,不會錯的。好東西大家一起分享!
祝你早日學會設計模式!