目錄
- 前言
- 學習參考
- 過程
- 總結:
前言
做個自由仔。
學習參考
- ChatGpt;
- https://www.cnblogs.com/zhili/p/DesignPatternSummery.html(大佬的,看了好多次)
過程
- 原由:
一開始只是想查查鏈式呼叫原理,以為是要繼承什麼介面,實現什麼方法才可以實現;像可以實現foreach;一查好簡單;哎~,是平時思考少了;成程式碼機器了,我冒昧了。
public class Person
{
private string _name;
private int _age;
public Person SetName(string name)
{
_name = name;
return this; // 返回當前物件以支援鏈式呼叫
}
public Person SetAge(int age)
{
_age = age;
return this; // 返回當前物件以支援鏈式呼叫
}
public void Display()
{
Console.WriteLine($"Name: {_name}, Age: {_age}");
}
}
//呼叫:
Person person = new Person();
// 鏈式呼叫示例
person.SetName("John")
.SetAge(30)
.Display();
- 然後我就看到了構建器模式;又一次理解了一次(抱歉以前的忘了;)
然後又問了問優點,適用場景;
優點:
- 可讀性高: 構建器模式使程式碼更加易讀,特別是在建立複雜物件時。
- 靈活性: 可以很容易地新增或刪除屬性,而不需要更改客戶端程式碼。
- 不可變物件: 透過構建器模式可以建立不可變物件(所有屬性在物件建立後都不能更改),提高了程式碼的可靠性。
適用場景:
- 需要建立的物件具有很多可選引數時。
- 物件的構建過程複雜時,例如需要分步驟進行初始化。
- 需要確保物件在建立時是有效的,並且不希望物件在建立後改變。
說實話,一開始我是沒理解這個靈活性的,因為我想到了直接傳遞一個引數實體;
那豈不更方便,結果後面給我說常常是兩者結合,來構建複雜的物件;好吧;
還有那個可讀性;這樣,我的物件初始化也可以呀(new person{})
public class Person
{
private string _name;
private int _age;
private string _address;
private Person() { }
public class Builder
{
private Person _person = new Person();
public Builder SetName(string name)
{
_person._name = name;
return this;
}
public Builder SetAge(int age)
{
_person._age = age;
return this;
}
public Builder SetAddress(string address)
{
_person._address = address;
return this;
}
public Person Build()
{
// 可以在這裡新增物件驗證邏輯
// 如:if (string.IsNullOrEmpty(_person._name))
// throw new InvalidOperationException("Make cannot be null or empty");
return _person;
}
}
}
//呼叫:
Person person = new Person.Builder()
.SetName("John")
.SetAge(30)
.SetAddress("123 Main St")
.Build();
Console.WriteLine($"Name: {person._name}, Age: {person._age}, Address: {person._address}");
// 輸出: Name: John, Age: 30, Address: 123 Main St
-------------------------------------------------------------------
//使用引數物件
public class PersonParameters
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
public class Person
{
private string _name;
private int _age;
private string _address;
private Person() { }
public class Builder
{
private PersonParameters _parameters = new PersonParameters();
public Builder SetName(string name)
{
_parameters.Name = name;
return this;
}
public Builder SetAge(int age)
{
_parameters.Age = age;
return this;
}
public Builder SetAddress(string address)
{
_parameters.Address = address;
return this;
}
public Person Build()
{
//構造物件初始化
Person _person=new Person
{
Name=_parameters.Name,
Age=_parameters.Age,
Name=_parameters.Name,
}
return _person;
}
}
}
- 後面我就想到了Serilog;那個初始化好像就是鏈式的;構建器模式耶;(主機構建哪裡都是,抱歉了)
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
- 接著我繼續問:.MinimumLevel.Debug() 這裡的MinimumLevel是一個類;而Debug()是一個靜態方法麼;
我是想的MinimumLevel靜態類,Debug()是一個靜態方法;
好吧我的想法是錯的;是中間加了一個類來設定一些資訊;或者中間類的擴充套件方法來的
public class LoggerConfiguration
{
public LoggerMinimumLevelConfiguration MinimumLevel { get; }
public LoggerSinkConfiguration WriteTo { get; }
// 其他配置方法和屬性...
public LoggerConfiguration()
{
MinimumLevel = new LoggerMinimumLevelConfiguration(this);
WriteTo = new LoggerSinkConfiguration(this);
}
}
public class LoggerMinimumLevelConfiguration
{
private readonly LoggerConfiguration _loggerConfiguration;
public LoggerMinimumLevelConfiguration(LoggerConfiguration loggerConfiguration)
{
_loggerConfiguration = loggerConfiguration;
}
public LoggerConfiguration Debug()
{
_loggerConfiguration.MinimumLevelControlledBy(new LoggingLevelSwitch(LogEventLevel.Debug));
return _loggerConfiguration;
}
// 其他級別設定方法...
}
----------
//,WriteTo.Console()
//使用擴充套件方法
public static class LoggerSinkConfigurationExtensions
{
public static LoggerConfiguration Console(this LoggerSinkConfiguration sinkConfiguration)
{
//列印
return sinkConfiguration.Sink(new ConsoleSink());
}
// 其他擴充套件方法...
}
//使用中間類
public class LoggerSinkConfiguration
{
private readonly LoggerConfiguration _loggerConfiguration;
public LoggerSinkConfiguration(LoggerConfiguration loggerConfiguration)
{
_loggerConfiguration = loggerConfiguration;
}
public LoggerConfiguration Console()
{
// 配置控制檯輸出
return _loggerConfiguration;
}
public LoggerConfiguration File(string path, RollingInterval rollingInterval)
{
// 配置檔案輸出及滾動策略
return _loggerConfiguration;
}
// 其他輸出目標配置方法...
}
- 然後我又看了一下,回顧了我收藏的資源,果然我適合當鹹魚。
總結:
主要了為了記憶深刻一些;感覺有了那些大模型後更加懶了,不僅不主動去了解一些知識,也覺得以前寫都沒多大意義;留著留個念想;
覺得反正ai一下麼,不手到擒來(想法是錯的,使人懶惰,技術很難精進的);但是如果當個小嘍嘍,實話說無所謂了,我們很自信,我們也要掂量掂量自己的分量。
當然我也希望可以直接大躍進到,腦機介面民用,直接動腦子搜尋(在思維上),直接讀取相關資料就好了,也不能都記住,畢竟記憶體還是有限的,腦容量是硬碟,記憶是記憶體。