设计模式 - 建造者模式
1.设计模式6原则 2.设计模式23种3.设计模式 - 单例模式4.设计模式 - 原型模式5.设计模式 - 抽象工厂6.设计模式 - 工厂方法7.设计模式 - 解释器模式8.设计模式 - 代理模式9.设计模式 - 外观模式10.设计模式 - 装饰者模式11.设计模式 - 组合模式12.设计模式 - 适配器模式13.设计模式 - 桥接模式
14.设计模式 - 建造者模式
15.设计模式 - 享元模式16.设计模式 - 策略模式17.设计模式 - 访问者模式18.设计模式 - 状态模式19.设计模式 - 迭代器模式20.设计模式 - 观察者模式21.设计模式 - 命令模式22.设计模式 - 中介者模式23.设计模式 - 备忘录模式24.设计模式 - 职责链模式25.设计模式 - 模板方法模式定义
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
UML
实例
StringBuilder,JSon数据交换
- 减少 重叠构造函数(telescopic constructor) 的出现。
- 构造组合树或其他复杂对象。
比较
比较 | 建造者模式 | 备注 |
---|---|---|
抽象工厂 | 重点关注如何分步生成复杂对象,在获取产品前可以执行一些额外构造步骤 | 抽象工厂专门用于生产一系列相关对象,可以马上返回产品 |
组合模式 | 建造者可以递归创建复杂组合模式树 | |
桥接模式 | 各种不同的建造者负责实现工作 | 主管类负责抽象工作 |
扩展
TreeList根据不同类型,绑定不同数据,并跳转不同页面。同时,根据状态显示不同图标。
IBuilder
interface IBuilder
{
List<TreeNodeDto> Result { get; }
void Reset();
void BuildBase();
void BuildPass(string name);
/// <summary>
/// 刷新子节点状态
/// </summary>
/// <param name="tree"></param>
/// <param name="recipe"></param>
void RefreshSubNodeStatus(TreeList tree, Demo demo);
}
Director
class Director
{
private readonly IBuilder _builder;
public Director(IBuilder builder)
{
_builder = builder;
}
public void ChangeBuilder(IBuilder builder)
{
}
public void Make(List<string> passes)
{
_builder.BuildBase();
foreach (var name in passes)
{
_builder.BuildPass(name);
}
}
public void RefreshSubNodeStatus(TreeList tree, Demo demo)
{
_builder.RefreshSubNodeStatus(tree, recipe);
}
}
class DirectorFactory
{
public static IBuilder GenerateDirector(DemoTypeEnum type)
{
IBuilder builder = null;
switch (type)
{
case DemoTypeEnum.Type1:
builder = new Concrete1Builder();
break;
case DemoTypeEnum.Type12:
builder = new Concrete2Builder();
break;
default:
break;
}
return builder;
}
}
ConcreteBuilder
class Concrete1Builder : BuilderBase
{
public Concrete1Builder() : base()
{
}
public override void BuildBase()
{
Result.Add(new TreeNodeDto(1, 0, TreeNodeEnum.TreeNode, typeof(UserControl1)));
Result.Add(new TreeNodeDto(2, 0, TreeNodeEnum.TreeNode2, typeof(UserControl2)));
Result.Add(new TreeNodeDto(3, 0, TreeNodeEnum.TreeNode3, typeof(UserControl3)));
_passId = _passParentId = Result.Count;
}
public override void BuildPass(string name)
{
_passId += 1;
Result.Add(new TreeNodeDto(_passId, _passParentId, name, typeof(Nullable)));
var id = _passId + 1;
Result.Add(new TreeNodeDto(id++, _passId, TreeNodeEnum.ChildNode, typeof(UserControl4)));
Result.Add(new TreeNodeDto(id++, _passId, TreeNodeEnum.ChildNode2, typeof(UserControl5)));
Result.Add(new TreeNodeDto(id++, _passId, TreeNodeEnum.ChildNode3, typeof(UserControl6)));
_passId = id;
}
}
class BuilderBase : IBuilder
{
protected int _passParentId;
protected int _passId;
public List<TreeNodeDto> Result { get; }
protected Demo _demo;
public BuilderBase()
{
Result = new List<TreeNodeDto>();
}
public virtual void Reset()
{
Result.Clear();
}
public virtual void BuildBase()
{
}
public virtual void BuildPass(string name)
{
}
public void RefreshSubNodeStatus(TreeList tree, Demo demo)
{
if (demo == null)
{
return;
}
_demo = demo;
foreach (TreeListNode node in tree.Nodes)
{
var txt = node.GetDisplayText(0);
var data = tree.GetDataRecordByNode(node) as TreeNodeDto;
if (data == null)
{
continue;
}
bool isCompleted = false;
bool isEnabled = false;
var @enum = GlobalCommFunc.EnumHelper.GetValueByDescription<TreeNodeEnum>(data.DisplayText);
switch (@enum)
{
case TreeNodeEnum.TreeNode:
{
isCompleted = IsTreeNodeValidable();
isEnabled = IsTreeNodeEditable();
}
break;
case TreeNodeEnum.TreeNode2:
{
isCompleted = IsTreeNode2Validable();
isEnabled = IsTreeNode2Editable();
}
break;
case RecipeNodeEnum.TreeNode3:
{
bool treeNodeCompleted = true;
foreach (TreeListNode passNode in node.Nodes)
{
bool passNodeCompleted = true;
var passData = tree.GetDataRecordByNode(passNode) as TreeNodeDto;
if (passData == null)
{
continue;
}
foreach (TreeListNode childNode in passNode.Nodes)
{
bool childNodeIscompleted = false;
var childData = tree.GetDataRecordByNode(childNode) as TreeNodeDto;
if (childData == null)
{
continue;
}
@enum = GlobalCommFunc.EnumHelper.GetValueByDescription<TreeNodeEnum>(data.DisplayText);
switch (@enum)
{
case RecipeNodeEnum.ChildNode:
{
childNodeIscompleted = IsChildNodeValidable();
isEnabled = IsChildNodeEditable();
}
break;
case RecipeNodeEnum.ChildNode2:
{
childNodeIscompleted = IsChildNode2Validable();
isEnabled = IsChildNode2Editable();
}
break;
case RecipeNodeEnum.ChildNode3:
{
childNodeIscompleted = IsChildNode3Validable();
isEnabled = IsChildNode3Editable();
}
break;
default:
//其他不存在的节点,默认为Complete,否则会影响最终颜色显示
childNodeIscompleted = true;
break;
}
childNode.Tag = isEnabled;
//更新节点状态
if (childNodeIscompleted)
{
childData.ImageIndex = 0;
}
else if (isEnabled)
{
childData.ImageIndex = 1;
}
else
{
childData.ImageIndex = 2;
}
passNodeCompleted &= childNodeIscompleted;
}
if (passNodeCompleted)
{
isCompleted = true;
isEnabled = true;
}
else
{
isCompleted = false;
}
passNode.Tag = isEnabled;
if (!recipe.CurrentPass.Active)
{
passData.ImageIndex = 3;
}
else if (isCompleted)
{
passData.ImageIndex = 0;
}
else if (isEnabled)
{
passData.ImageIndex = 1;
}
else
{
passData.ImageIndex = 2;
}
treeNodeCompleted &= passNodeCompleted;
}
if (treeNodeCompleted)
{
isCompleted = true;
isEnabled = true;
}
else
{
isCompleted = false;
}
}
break;
default:
break;
}
node.Tag = isEnabled;
if (isCompleted)
{
data.ImageIndex = 0;
}
else if (isEnabled)
{
data.ImageIndex = 1;
}
else
{
data.ImageIndex = 2;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-04-21 Ling应用