分类 编程基础 中的文章

洗牌算法

暴力洗牌 n个元素共有n!个排列,暴力枚举每种情况,从中获取的一种作为洗牌结果。O(n!)复杂度。 Knuth洗牌算法 1 2 3 4 5 6 7 8 public static void Shuffle<T>(IList<T> items) { var rn = new Random((int) DateTime.Now.Ticks); for (var i = items.Count - 1; i >= 0; i--) { Swap(items, i, rn.Next(i + 1)); } }……

阅读全文

设计模式之工厂方法模式

工厂方法模式 定义 定义一个可以产生对象的接口,但是让子类决定要产生哪个类的对象。工厂方法模式让类的实例化程序推迟到子类中实现。 UML 实现方式 由子类决定生产哪个类的对象 在工厂方法中增加参数,由参数决定生产哪个类对象 使用泛型类 使用泛型工厂方法 注意……

阅读全文

算法之排序

选择排序 算法描述 算法复杂度 c# 代码实现 插入排序 算法描述 算法复杂度 c# 代码实现 希尔排序 算法描述 算法复杂度 c# 代码实现 归并排序 算法描述 将要排序的数组分成两半分别排序后归并。 算法复杂度 时间复杂度 NlogN 空间复杂度 N c# 代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37……

阅读全文

设计模式之桥接模式(Bridge)

桥接模式 定义 将抽象和实现分离,以达到二者独立进化的目的。 UML 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 public abstract class Implementor { public abstract void OperatorImp(); } public class ConcreteImplementor1 : Implementor { public override void OperatorImp() { Debug.Log($"执行{nameof(ConcreteI……

阅读全文

设计模式之中介者模式(Mediator)

中介者模式 定义 将子系统间的互动委托给中介者,减少子系统相互调用的耦合,子系统通过中介者交互。 UML 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 public abstract class Mediator { public abstract void SendMessage(Colleague colleague, string message); }……

阅读全文

设置模式之外观模式(Facade)

外观模式 定义 为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用。 优点 统一接口,避免了客户端与各个子系统间的耦合。 增加了客户端复用的能力。 易于分工,使用者不必关心子系统的实现和使用细节,只需调用外观模式定义的高级接口就行。 注意事项 在使用外观模式时,十分容易将高级接口设……

阅读全文

设计模式之状态模式(State)

定义 让一个对象的行为随着内部状态的变更而改变,而该对象就像是换了类一样。 UML Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 using UnityEngine; public class Context { private State _state; public void Request(int value) { _state.Handle(value); } public void SetState(State state) { Debug.Log($"Context.SetState:{state}"); _state = state; } } public abstract class State……

阅读全文

设计模式之面向对象的设计原则

单一职责原则 每个类只负责一件事 开闭原则 对扩展开放,对修改关闭。将类中的功能上提抽象为接口,具体的功能实现下放到子类。 里氏替换原则 使用到父类的地方都能够用子类去替换。对于具体使用到哪个子类是无感的,透明的。 依赖倒置原则 高层模块不应该直接依赖底层模块,而是依赖于抽象。(让底层模块通过……

阅读全文