主頁 > 軟體設計 > 【組合設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

【組合設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

2023-04-04 08:49:51 軟體設計

簡介

組合模式(Composite Pattern),又叫部分整體模式,是一種結構型設計模式,用于把一組類似的物件當作一個單一的物件來看,組合模式依據樹形結構來組合物件,用不同組件來構建某個部分或整體物件,

如果你需要實作樹狀物件結構,可以使用組合模式,如果你希望客戶端代碼以相同方式處理簡單和復雜元素,可以使用該模式,

作用

  1. 符合開閉原則,無需更改現有代碼,就可以在應用中添加新元素,使之成為物件樹的一部分,
  2. 模糊了簡單元素和復雜元素的概念,程式可以像處理簡單元素一樣來處理復雜元素,從而使得程式與復雜元素的內部結構解耦,

實作步驟

  1. 創建抽象構件(Component)介面,用于宣告樹葉構件和樹枝構件的默認行為,
  2. 創建樹枝構件(Composite)角色 / 中間構件:是組合中的分支節點物件,它有子節點,用于繼承和實作抽象構件,它的主要作用是存盤和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法,
  3. 定義樹葉構件(Leaf)角色:是組合中的葉子節點物件,它沒有子節點,用于繼承或實作抽象構件,

UML

 

Java語言代碼

基礎部件介面

// OrganizationComponent.java 定義部件介面或抽象類,分支和葉子節點遵循該類約定
public interface OrganizationComponent {
   public void add(OrganizationComponent component);

   public void remove(OrganizationComponent component);

   public OrganizationComponent getChild(int index);

   public void operation();

   public String getName();
}

 

具體部件實作

// CompanyComposite.java 實作部件的樹枝構件1
public class CompanyComposite implements OrganizationComponent {

   private String name;
   private List<OrganizationComponent> children = new ArrayList<OrganizationComponent>();

   public CompanyComposite(String name) {
      this.name = name;
   }

   public void add(OrganizationComponent component) {
      children.add(component);
   }

   public void remove(OrganizationComponent component) {
      children.remove(component);
   }

   public OrganizationComponent getChild(int index) {
      return children.get(index);
   }

   public void operation() {
      System.out.println(this.getClass().getName() + " CompanyComposite::operation() " + this.name);
      for (Object component : children) {
         ((OrganizationComponent) component).operation();
      }
   }

   public String getName() {
      return name;
   }
}
// DepartmentComposite.java 實作部件的樹枝構件2 public class DepartmentComposite implements OrganizationComponent { private String name; private List<OrganizationComponent> children = new ArrayList<OrganizationComponent>(); public DepartmentComposite(String name) { this.name = name; } public void add(OrganizationComponent component) { children.add(component); } public void remove(OrganizationComponent component) { children.remove(component); } public OrganizationComponent getChild(int index) { return children.get(index); } public void operation() { System.out.println(this.getClass().getName() + " DepartmentComposite::operation() " + this.name); for (Object component : children) { ((OrganizationComponent) component).operation(); } } public String getName() { return name; } }
// EmployeeLeaf.java 實作部件的葉子節點,葉子節點不能再含有子節點 public class EmployeeLeaf implements OrganizationComponent { private String name; public EmployeeLeaf(String name) { this.name = name; } // 葉子節點不能再增加內容 public void add(OrganizationComponent component) { System.out.println("Leaf can't add."); } // 葉子節點沒有移除內容 public void remove(OrganizationComponent component) { System.out.println("Leaf can't remove."); } // 葉子節點無獲取子節點 public OrganizationComponent getChild(int index) { System.out.println("Leaf can't getChild."); return null; } public void operation() { System.out.println(this.getClass().getName() + " EmployeeLeaf::operation() " + this.name); } public String getName() { return name; } }

 

測驗呼叫

    /**
     * 組合模式依據樹形結構來組合物件,用不同組件來構建整體物件,
     * 不同組件之間有相同的介面約束,有不同的具體實作,
     * 先定義頂級節點,然后陸續加入枝葉節點和葉子節點,這樣不斷添加,將零散的個體組成一個整體,
     */

    // 通過組合模型組合了一個部件,分支和節點可以隨意增刪
    OrganizationComponent com = new CompanyComposite("西天旅游有限公司");
    OrganizationComponent com1 = new DepartmentComposite("總裁辦");
    OrganizationComponent com2 = new DepartmentComposite("行動隊");
    OrganizationComponent com3 = new DepartmentComposite("后勤組");
    OrganizationComponent leaf1 = new EmployeeLeaf("唐三藏");
    OrganizationComponent leaf2 = new EmployeeLeaf("孫悟空");
    OrganizationComponent leaf3 = new EmployeeLeaf("豬悟能");
    OrganizationComponent leaf4 = new EmployeeLeaf("沙悟凈");

    com.add(com1);
    com.add(com2);
    com.add(com3);

    // leaf1屬于com1
    com1.add(leaf1);
    // leaf2, leaf3屬于com2
    com2.add(leaf2);
    com2.add(leaf3);

    // 添加再洗掉
    DepartmentComposite dept1 = new DepartmentComposite("小分隊");
    com2.add(dept1);
    EmployeeLeaf tmp1 = new EmployeeLeaf("臨時工");
    dept1.add(tmp1);
    dept1.remove(tmp1);

    // leaf4屬于com3
    com3.add(leaf4);

    // 執行全部節點動作
    com.operation();

    // 獲取某個節點
    OrganizationComponent employee = (EmployeeLeaf) com.getChild(1).getChild(0);
    System.out.println(employee.getName());

 

C語言代碼

func.h 自定義頭檔案
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

// 定義部件介面或抽象類,分支和葉子節點遵循該類約定
typedef struct OrganizationComponent
{
    char name[200];
    void (*add)(struct OrganizationComponent *, struct OrganizationComponent *);
    void (*remove)(struct OrganizationComponent *, struct OrganizationComponent *);
    struct OrganizationComponent *(*get_child)(struct OrganizationComponent *, int);
    void (*operation)(struct OrganizationComponent *);
    int children_size;
    struct OrganizationComponent **children;
    // 如果是柔型陣列,則自動擴展陣列長度,但可能導致出現亂碼現象,故采取固定長度陣列
    // struct OrganizationComponent *children[];
} OrganizationComponent;
void add_component(OrganizationComponent *, OrganizationComponent *);
void remove_component(OrganizationComponent *, OrganizationComponent *);
OrganizationComponent *get_child_component(OrganizationComponent *, int);
void print_children(OrganizationComponent *children[], int children_size);

// 實作部件的樹枝構件1
typedef struct CompanyComposite
{
    char name[200];
    void (*add)(struct OrganizationComponent *, struct OrganizationComponent *);
    void (*remove)(struct OrganizationComponent *, struct OrganizationComponent *);
    struct OrganizationComponent *(*get_child)(struct OrganizationComponent *, int);
    void (*operation)(struct CompanyComposite *);
    int children_size;
    struct OrganizationComponent **children;
} CompanyComposite;
CompanyComposite *company_composite_constructor(char *name);

// 實作部件的樹枝構件2
typedef struct DepartmentComposite
{
    char name[200];
    void (*add)(struct OrganizationComponent *, struct OrganizationComponent *);
    void (*remove)(struct OrganizationComponent *, struct OrganizationComponent *);
    struct OrganizationComponent *(*get_child)(struct OrganizationComponent *, int);
    void (*operation)(struct DepartmentComposite *);
    int children_size;
    struct OrganizationComponent **children;
} DepartmentComposite;
DepartmentComposite *department_composite_constructor(char *name);

// 實作部件的葉子節點,葉子節點不能再含有子節點
typedef struct EmployeeLeaf
{
    char name[200];
    void (*add)(struct OrganizationComponent *, struct OrganizationComponent *);
    void (*remove)(struct OrganizationComponent *, struct OrganizationComponent *);
    struct OrganizationComponent *(*get_child)(struct OrganizationComponent *, int);
    void (*operation)(struct EmployeeLeaf *);
    int children_size;
    struct OrganizationComponent **children;
} EmployeeLeaf;
EmployeeLeaf *employee_leaf_constructor(char *name);

 

基礎部件介面

// organization_component.c 定義部件介面或抽象類,分支和葉子節點遵循該類約定
#include "func.h"

// 定義部件介面或抽象類,分支和葉子節點遵循該類約定
// C語言沒有介面和抽象類,用struct替代,同時把公共函式宣告在這里

// 添加一個組件到子節點中
void add_component(OrganizationComponent *parent, OrganizationComponent *component)
{
  // 先將原陣列保留下來
  OrganizationComponent **old_children = parent->children;
  parent->children_size += 1;
  // 新申請空間給子節點陣列
  parent->children = (OrganizationComponent **)calloc(parent->children_size, sizeof(OrganizationComponent *));
  for (int i = 0; i < parent->children_size - 1; i++)
  {
    parent->children[i] = old_children[i];
  }
  // 將組件追加到子節點陣列中
  parent->children[parent->children_size - 1] = component;
  free(old_children);
}

// 移除第一個匹配的子節點
void remove_component(OrganizationComponent *parent, OrganizationComponent *component)
{
  int size = parent->children_size;
  // 初始化組件id大于陣列長度
  int com_idx = size;
  for (int i = 0; i < size; i++)
  {
    // 找到第一個匹配的組件下標
    if (parent->children[i] == component)
    {
      com_idx = i;
    }

    // 自匹配項開始,后項逐個往前移動1位
    if (i >= com_idx)
    {
      parent->children[i] = parent->children[i + 1];
      // 最后一項置空且總長度減少1位
      if (i == size - 1)
      {
        parent->children[i] = NULL;
        parent->children_size -= 1;
      }
    }
  }
}

// 列印全部子節點
void print_children(OrganizationComponent *children[], int children_size)
{
  for (int i = 0; i < children_size; i++)
  {
    printf("\r\n    children[%d]=%s", i, children[i]->name);
  }
}

// 根據下標獲取子節點
OrganizationComponent *get_child_component(OrganizationComponent *component, int index)
{
  return component->children[index];
}

 

具體部件實作

// company_composite.c 實作部件的樹枝構件1
#include "func.h"

// 實作部件的樹枝構件1
void company_composite_operation(CompanyComposite *component)
{
  printf("\r\n CompanyComposite::operation() [name=%s]", component->name);
  print_children(component->children, component->children_size);
  for (int i = 0; i < component->children_size; i++)
  {
    if (component->children[i] != NULL)
    {
      component->children[i]->operation(component->children[i]);
    }
  }
}

// 創建CompanyComposite物件
CompanyComposite *company_composite_constructor(char *name)
{
  OrganizationComponent *component = (OrganizationComponent *)malloc(sizeof(OrganizationComponent));
  strncpy(component->name, name, 200);
  component->add = &add_component;
  component->remove = &remove_component;
  component->children_size = 0;
  component->get_child = &get_child_component;
  // 轉為CompanyComposite
  CompanyComposite *company_composite = (CompanyComposite *)component;
  company_composite->operation = &company_composite_operation;
  return company_composite;
}

// department_composite.c 實作部件的樹枝構件2 #include "func.h" // 實作部件的樹枝構件2 void department_composite_operation(DepartmentComposite *component) { printf("\r\n DepartmentComposite::operation() [name=%s]", component->name); print_children(component->children, component->children_size); for (int i = 0; i < component->children_size; i++) { if (component->children[i] != NULL) { component->children[i]->operation(component->children[i]); } } } // 創建DepartmentComposite物件 DepartmentComposite *department_composite_constructor(char *name) { OrganizationComponent *component = (OrganizationComponent *)malloc(sizeof(OrganizationComponent)); strncpy(component->name, name, 200); component->add = &add_component; component->remove = &remove_component; component->children_size = 0; component->get_child = &get_child_component; // 轉為DepartmentComposite DepartmentComposite *department_composite = (DepartmentComposite *)component; department_composite->operation = &department_composite_operation; return department_composite; }

// employee_leaf.c 實作部件的葉子節點,葉子節點不能再含有子節點 #include "func.h" // 實作部件的葉子節點,葉子節點不能再含有子節點 // 葉子節點不能再增加內容 void add_leaf_component(OrganizationComponent *parent, OrganizationComponent *component) { printf("\r\n Leaf can't add."); } // 葉子節點沒有移除內容 void remove_leaf_component(OrganizationComponent *parent, OrganizationComponent *component) { printf("\r\n Leaf can't remove."); } // 葉子節點不能獲取子節點 OrganizationComponent *get_leaf_child_component(OrganizationComponent *component, int index) { printf("\r\n Leaf can't get_child."); return NULL; } // 子節點的操作函式 void employee_leaf_operation(EmployeeLeaf *component) { printf("\r\n EmployeeLeaf::operation() [name=%s]", component->name); } // 創建EmployeeLeaf物件 EmployeeLeaf *employee_leaf_constructor(char *name) { OrganizationComponent *component = (OrganizationComponent *)malloc(sizeof(OrganizationComponent)); strncpy(component->name, name, 200); component->children_size = 0; component->add = &add_leaf_component; component->remove = &remove_leaf_component; component->get_child = &get_leaf_child_component; // 轉為EmployeeLeaf EmployeeLeaf *employee_leaf = (EmployeeLeaf *)component; employee_leaf->operation = &employee_leaf_operation; return employee_leaf; }

 

測驗呼叫

   /**
    * 組合模式依據樹形結構來組合物件,用不同組件來構建整體物件,
    * 不同組件之間有相同的介面約束,有不同的具體實作,
    * 先定義頂級節點,然后陸續加入枝葉節點和葉子節點,這樣不斷添加,將零散的個體組成一個整體,ss
    */

   // 通過組合模型組合了一個部件,分支和節點可以隨意增刪
   OrganizationComponent *com = (OrganizationComponent *)company_composite_constructor("西天旅游有限公司");
   OrganizationComponent *com1 = (OrganizationComponent *)department_composite_constructor("總裁辦");
   OrganizationComponent *com2 = (OrganizationComponent *)department_composite_constructor("行動隊");
   OrganizationComponent *com3 = (OrganizationComponent *)department_composite_constructor("后勤組");

   OrganizationComponent *leaf1 = (OrganizationComponent *)employee_leaf_constructor("唐三藏");
   OrganizationComponent *leaf2 = (OrganizationComponent *)employee_leaf_constructor("孫悟空");
   OrganizationComponent *leaf3 = (OrganizationComponent *)employee_leaf_constructor("豬悟能");
   OrganizationComponent *leaf4 = (OrganizationComponent *)employee_leaf_constructor("沙悟凈");

   com->add(com, com1);
   com->add(com, com2);
   com->add(com, com3);

   // leaf1屬于com1
   com1->add(com1, leaf1);
   // leaf2, leaf3屬于com2
   com2->add(com2, leaf2);
   com2->add(com2, leaf3);

   // 添加再洗掉
   DepartmentComposite *dept1 = department_composite_constructor("小分隊");
   com2->add(com2, (OrganizationComponent *)dept1);
   EmployeeLeaf *tmp1 = employee_leaf_constructor("臨時工");
   dept1->add((OrganizationComponent *)dept1, (OrganizationComponent *)tmp1);
   dept1->remove((OrganizationComponent *)dept1, (OrganizationComponent *)tmp1);

   // leaf4屬于com3
   com3->add(com3, leaf4);

   // 執行全部節點動作
   com->operation(com);

   // 獲取某個節點
   OrganizationComponent *dept2 = com->get_child(com, 1);
   EmployeeLeaf *employee_child1 = (EmployeeLeaf *)dept2->get_child(dept2, 0);
   printf("\r\n [employee->name=%s]", employee_child1->name);

 

更多語言版本

不同語言實作設計模式原始碼,請查看:https://github.com/microwind/design-pattern

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/549085.html

標籤:其他

上一篇:【Design Pattern 23種經典設計模式原始碼詳解】Java/JS/TS/Python/Go不同語言實作

下一篇:9款日志采集&管理工具對比,選型必備!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more