1. 程式人生 > >Python3 與 C# 擴充套件之~基礎拓展

Python3 與 C# 擴充套件之~基礎拓展

終於期末考試結束了,聰明的小明同學現在當然是美滋滋的過暑假了,左手一隻瓜,右手一本書~正在給老鄉小張同學拓展他研究多日的知識點

1.NetCore裝飾器模式

裝飾器這次從C#開始引入,上次剛講迭代器模式,這次把裝飾器模式也帶一波(純Python方向的可以選擇性跳過,也可以當擴充套件)

其實通俗講就是,給原有物件動態的新增一些額外的職責(畢竟動不動就改類你讓其他呼叫的人咋辦?也不符合開放封閉原則是吧~)

BaseComponent.cs

/// <summary>
/// 元件的抽象父類
/// </summary>
public abstract class BaseComponent
{ /// <summary> /// 定義一個登入的抽象方法 /// 其他方法,這邊省略 /// </summary> public abstract string Login(); }

LoginComponent.cs

/// <summary>
/// 預設登入元件(賬號+密碼)
/// 其他方法省略
/// 友情提醒一下,抽象類裡面可以定義非抽象方法
/// </summary>
public class LoginComponent : BaseComponent
{
    public override
string Login() { return "預設賬號密碼登入"; } }

預設呼叫:

static void Main(string[] args)
{
    var obj = new LoginComponent();
    var str = obj.Login();
    Console.WriteLine(str);
}

如果這時候平臺需要新增微信第三方登入,怎麼辦?一般都是用繼承來解決,其實還可以通過靈活的裝飾器來解決:(好處可以自己體會)

先定義一個通用裝飾器(不一定針對登入,註冊等等只要在BaseComponent中的都能用)

/// <summary>
/// 裝飾器
/// </summary>
public class BaseDecorator : BaseComponent
{
    protected BaseComponent _component;
    /// <summary>
    /// 建構函式
    /// </summary>
    /// <param name="obj">登入元件物件</param>
    protected BaseDecorator(BaseComponent obj)
    {
        this._component = obj;
    }
    public override string Login()
    {
        string str = string.Empty;
        if (_component != null) str = _component.Login();
        return str;
    }
}

現在根據需求新增微信登入:(符合開放封閉原則)

/// <summary>
/// 預設登入元件(賬號+密碼)
/// 其他方法省略
/// </summary>
public class WeChatLoginDecorator : BaseDecorator
{
    public WeChatLoginDecorator(BaseComponent obj) : base(obj)
    {
    }
    /// <summary>
    /// 新增微信第三方登入
    /// </summary>
    /// <returns></returns>
    public string WeChatLogin()
    {
        return "add WeChatLogin";
    }
}

呼叫:(原有系統該怎麼用就怎麼用,新系統可以使用裝飾器來新增新功能)

static void Main(string[] args)
{
    #region 登入模組V2
    // 例項化登入裝飾器
    var loginDecorator = new WeChatLoginDecorator(new LoginComponent());
    // 原有的登入方法
    var str1 = loginDecorator.Login();
    // 現在新增的登入方法
    var str2 = loginDecorator.WeChatLogin();
    Console.WriteLine($"{str1}\n{str2}");
    #endregion
}

結果:

預設賬號密碼登入
add WeChatLogin

如果再加入QQ和新浪登入的功能就再新增一個V3版本的裝飾器,繼承當時V2版本的登入即可(版本迭代特別方便)

/// <summary>
/// 預設登入元件(賬號+密碼)
/// 其他方法省略
/// </summary>
public class LoginDecoratorV3 : WeChatLoginDecorator
{
    public LoginDecoratorV3(BaseComponent obj) : base(obj)
    {
    }

    /// <summary>
    /// 新增QQ登入
    /// </summary>
    /// <returns></returns>
    public string QQLogin()
    {
        return "add QQLogin";
    }

    /// <summary>
    /// 新增新浪登入
    /// </summary>
    /// <returns></returns>
    public string SinaLogin()
    {
        return "add SinaLogin";
    }
}

呼叫:

static void Main(string[] args)
{
    #region 登入模組V3
    // 例項化登入裝飾器
    var loginDecoratorV3 = new LoginDecoratorV3(new LoginComponent());
    // 原有的登入方法
    var v1 = loginDecoratorV3.Login();
    // 第二個版本迭代中的微信登入
    var v2 = loginDecoratorV3.WeChatLogin();
    // 新增的QQ和新浪登入
    var qqLogin = loginDecoratorV3.QQLogin();
    var sinaLogin = loginDecoratorV3.SinaLogin();
    Console.WriteLine($"{v1}\n{v2}\n{qqLogin}\n{sinaLogin}");
    #endregion
}

結果:

預設賬號密碼登入
add WeChatLogin
add QQLogin
add SinaLogin

其實還有很多用處,比如原有系統快取這塊當時考慮不到,現在併發來了,已經上線了,原有程式碼又不太敢大幅度修改,這時候裝飾器就很方便的給某些功能新增點快取、測試、日記等等系列功能(AOP裡面很多這種概念)

實際場景說的已經很明白了,其他的自己摸索一下吧

相關推薦

Python3 C# 擴充套件基礎拓展

終於期末考試結束了,聰明的小明同學現在當然是美滋滋的過暑假了,左手一隻瓜,右手一本書~正在給老鄉小張同學拓展他研究多日的知識點 1.NetCore裝飾器模式¶ 裝飾器這次從C#開始引入,上次剛講迭代器模式,這次把裝飾器模式也帶一波(純Python方向的可以選擇性跳過,也可以當擴充套件)

Python3 C# 擴充套件基礎衍生

Help on generator object: test = class generator(object) | Methods defined here: | | __del__(...) | | __getattribute__(self, name, /)

Python3 C# 擴充套件模組專欄

3.控制可使用的函式、變數、類¶ 3.1.通過私有來控制¶ 在一個模組中,我們可能會定義很多函式和變數,但有的函式和變數我們希望給別人使用,有的函式和變數我們希望僅僅在模組內部使用。在Python中,是通過_字首來實現的 小明同學基礎功底紮實,看見標題小明就樂了,前面看了這麼多案例瞬間秒懂,大叫道~

Python3 C# 網路程式設計 網路基礎

最新版本檢視:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入門篇 官方文件:https://docs.python.org/3/library/ipc.html(程序間通訊和網路) 例項程式碼:https://github.com/lotapp/

Python3 C# 面向對象異常相關

efi bsp sof 一個 name final href 場景 插件 周末多碼文,昨天晚上一篇,今天再來一篇: 在線編程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在線預覽:http://github.les

Python3 C# 並發編程 上篇

動態 ken summary using 任務調度 影響 特征 可能 arp NetCore並發編程 示例代碼:https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先簡單說下概念(其實之前

Python3 C# 併發程式設計 執行緒上篇

2.2.加強篇¶ 其實以前的Linux中是沒有執行緒這個概念的,Windows程式設計師經常使用執行緒,這一看~方便啊,然後可能是當時程式設計師偷懶了,就把程序模組改了改(這就是為什麼之前說Linux下的多程序程式設計其實沒有Win下那麼“重量級”),弄了個精簡版程序==>執行緒(核心是分不出程序

Python3 C# 併發程式設計程序先導篇

2.2.殭屍程序和孤兒程序¶ 先看看定義: 孤兒程序 :一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。 殭屍程序 :一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有

Python3 C# 併發程式設計 程序篇

NetCore併發程式設計¶  Python的執行緒、並行、協程下次說 先簡單說下概念(其實之前也有說,所以簡說下): 併發:同時做多件事情 多執行緒:併發的一種形式 並行處理:多執行緒的一種(執行緒池產生的一種併發型別,eg:非同步程式設計) 響應式程式設計:一種程式設計模式,對事件

Python3 C# 面向物件封裝

關於__name__在模組呼叫的時候會詳細說,你可以先這樣理解:如果直接執行py檔案就執行,別人呼叫那麼你的main就不執行了 標準寫法: # 1.匯入的模組 # 2.class的定義 # 3.其他方法定義 def main(): pass if __name__ ==

Python3 C# 面向物件異常相關

老師問了小明一聲,有幾個輸出? 小明驕傲的說道:“兩個,我寫了兩個異常處理,當然都執行了” 同學們又笑了,小潘調侃的說了句:“一看就知道去年C#沒好好學,這不都一樣嘛,遇到異常下面程式碼還執行嗎?用腦子好好想想” 當我們認為某些程式碼可能會出錯時,就可以用try來執行這段程式碼,如果執行出錯,則後續

Python3 C# 面向物件繼承多型

Python的多繼承最好是當C#或者Java裡面的介面使用,這樣結構不會混亂( 特殊情況除外) 來個例子: class Animal(object): pass class Flyable(object): """飛的方法""" pass class Ru

Python3 C# 基礎語法對比(List、Tuple、Dict、Set專欄)

Help on class set in module builtins: class set(object) | set() -> new empty set object | set(iterable) -> new set object | | Build

Python3 C# 基礎語法對比(String專欄)

using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; public static partial class ValidationHelp

Python3 C# 基礎語法對比(Function專欄)

主要是普及一下Python基礎語法,對比著Net,新手更容易上手。 對比學習很有意思的,尤其是一些底層和思路 本來感覺函式要說的地方沒多少,細細一規劃,發現~還是單獨拉出一篇說說吧 之後就進入面向物件了,函式還是有必要了解一下的,不然到時候Class裡面的方法定義又要說了。 演示的

Python3 C# 基礎語法對比(就當Python和C#基礎的普及吧)

['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global'

JavaC 個人比較

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

php實戰C擴充套件陣列

近來看了php的c擴充套件書寫,嘗試接入陣列處理,學會了幾個HashTable處理函式記錄如下: zend_hash_next_index_insert   插入資料(數字陣列或者關聯陣列); zend_hash_add 插入關聯陣列 zend_hash_index_upd

C語言第三戰!

  我與C語言第三戰之num1:將陣列A中的內容和陣列B中的內容進行交換。(陣列一樣大)   首先定義兩個陣列用以存放元素,為了更直觀的看到陣列內容進行了交換,先將之前定義的兩個陣列內容分別打印出來,然後利用for迴圈和中間變數,進行兩個陣列間元素的交換,最後進行列印即可。具體程式程式碼和執行結

Spring Cloud微服務構造基礎資料

文章目錄 單獨的資料Maven模組的好處 springcloud-goods-db springcloud-goods-db專案結構 springcloud-goods-db原始碼 其它地方的使用方式: