写点什么

架构师训练营 - 作业 3

用户头像
紫极
关注
发布于: 2020 年 06 月 24 日
架构师训练营-作业3

1. 手写单例模式

如下图,我常用的2中写法,

上面的是懒汉双重校验锁模式,线程安全的写法。理解起来就是私有化构造函数,在GetInstance方法中放回实例,在方法中先检查实例是否为空,防止线程锁过多的问题,再加个锁,再次检查实例是否为空,防止意外,最后新建实例,返回实例。

下面的是个人认为最简单的方法,就是直接将实例暴露成一个只读属性。



2. 使用组合模式写个Demo

个人理解:组合模式理解起来就是一类可抽象成一个抽象的一组对象的结构组合。



需求:



首先,声明个顶级组件接口 IComponent,只包含打印方法。

public interface IComponent
{
void Print();
}

然后声明个容器接口IContainer,可以添加子组件,或删除子组件。

public interface IContainer : IComponent
{
void AddSub(IComponent component);

void RemoveSub(IComponent component);
}

声明个抽象类ComponentBase,简化具体子类的操作。

public abstract class ComponentBase : IComponent
{
public string Name { get; private set; }

public string ComponentTypeName { get; internal set; }
public ComponentBase(string name)
{
Name = name;
}

public virtual void Print()
{
Console.WriteLine($"{ComponentTypeName}({Name})");
}
}

声明box类型抽象类BoxComponent,然后声明具体类型,继承抽象类。

其他直接实现IComonnet的类,如PictureComponent,LableComponent,ButtonComponent类似就不罗列。

public enum BoxType
{
TextBox,
PasswordBox,
CheckBox
}
public abstract class BoxComponent : ComponentBase, IComponent
{
private BoxType BoxType { get; set; }
public BoxComponent(string name, BoxType boxType = BoxType.TextBox) : base(name)
{
BoxType = boxType;
ComponentTypeName = boxType.ToString();
}
}
public class TextBoxComonent : BoxComponent
{
public TextBoxComonent(string name) : base(name, BoxType.TextBox)
{
}
}
public class PasswordBoxComonent : BoxComponent
{
public PasswordBoxComonent(string name) : base(name, BoxType.PasswordBox)
{
}
}
public class CheckBoxComonent : BoxComponent
{
public CheckBoxComonent(string name) : base(name, BoxType.CheckBox)
{
}
}

然后声明容器类型的组件WinformComponent,

包含私有属性subComponents,表示子组件集合,增加和删除就是针对这个属性操作。

重写Print方法以达到打印所有子组件目的。

public class WinformComponent : ComponentBase, IComponent, IContainer
{
private List<IComponent> subComponents = new List<IComponent>();
public WinformComponent(string name) : base(name)
{
ComponentTypeName = "Winform";
}
public virtual void AddSub(IComponent component)
{
subComponents.Add(component);
}
public virtual void RemoveSub(IComponent component)
{
subComponents.Remove(component);
}
public override void Print()
{
base.Print();
foreach (var component in subComponents)
{
component.Print();
}
}
}

最后,实际调用,依次声明组件,并将组件进行组合。

class Program
{
static void Main(string[] args)
{
WinformComponent winform = new WinformComponent("Window窗口");
PictureComponent picture = new PictureComponent("LOGO图片");
ButtonComponent logonButton = new ButtonComponent("登录");
ButtonComponent registerButton = new ButtonComponent("注册");
FrameComponent frame = new FrameComponent("Frame1");
TextLableComonent textLable = new TextLableComonent("用户名");
TextBoxComonent textBox = new TextBoxComonent("文本框");
TextLableComonent textLable1 = new TextLableComonent("密码");
PasswordBoxComonent passwordBox = new PasswordBoxComonent("密码框");
CheckBoxComonent checkBox = new CheckBoxComonent("复选框");
TextLableComonent textLable2 = new TextLableComonent("记住密码");
LinkLableComonent linkLable = new LinkLableComonent("忘记密码");
winform.AddSub(picture);
winform.AddSub(logonButton);
winform.AddSub(registerButton);
winform.AddSub(frame);
frame.AddSub(textLable);
frame.AddSub(textBox);
frame.AddSub(textLable1);
frame.AddSub(passwordBox);
frame.AddSub(checkBox);
frame.AddSub(textLable2);
frame.AddSub(linkLable);
winform.Print();
Console.ReadKey();
}
}

调用打印主组件的打印方法,结果如下



总结

优点:实现组件的解耦,很容易的加入新的组件

缺点:需要理清组件间的关系,依次进行组合

用户头像

紫极

关注

还未添加个人签名 2018.08.28 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营-作业3