随笔分类 - 设计模式
设计模式
摘要:首先还是声明一下,使用场景:1、如果编译时函数名称确定,对象类型运行时确定,那么运用dynamic是一个好主意。2、如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynamic。3、如果函数名称在运行时才能确定的话,那函数名称就是一个字符串,必须使用反射来完成。那么我们肯定是是在第一种情况中使用dynamic类型改进反射:(编译时函数名称确定,对象类型运行时确定)假设我们需要反射调用的函数是:namespace ClassLibrary{ public class Demo { public string GetName() ...
阅读全文
摘要://怎样才能容易更换DB//写一个可以对用户插入和获取的方法namespace switchDB{ class User { public int ID { get; set; } public string Name { get; set; } } class SqlServerUser { public void Insert(User user) { } public void GetUser(int id) { } } class Program { static void Main(string[] args) { User u = new User(); SqlServerUse.
阅读全文
摘要:桥接模式:将对象部分与它的实现部分分离,使它们可以独立的变化。结构图: class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } class RefinedAbstraction : Abstraction { public override .
阅读全文
摘要:单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。结构图://单线程 class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }//多线程 class Singleton2 { private static Singleton2 instance; privat
阅读全文
摘要:组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。需求中式体现部分与整体层次的结构时,统一地使用组合对象中的所有对象时,应该考虑使用组合模式。结构图:抽象对象: abstract class Component { protected string name; public Component(string name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove(Component c); pub
阅读全文
摘要:备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在这个对象之外的地方保存这个状态,这样以后就可将该对象恢复到原来保存的状态了。结构图:Memento类:保存状态的容器 class Memento { public string State { get; set; } public Memento(string state) { this.State = state; } }Caretaker是保存Memento类: class Caretaker { public Memento Memento { get; set; } }Originator类就是需要保存状态的类: class
阅读全文
摘要:适配器模式:将一个类的接口转换成客户希望的另一个接口,Adapter使原本由于接口不兼容而不能一起工作的那些类可以一起工作。结构图:客户可以对接的接口类: class Target { public virtual void Request() { Console.WriteLine("普通请求!"); } }客户需要使用适配器才能使用的接口: class Adaptee { public void SpecialRequest() { Console.WriteLine("特殊请求!"); } }适配器的定义:继承与Target类 class Adap
阅读全文
摘要:状态模式:当一个对象的内在状态改变时,允许改变其行为。这个对象看起来像是改变了其类。主要解决是当控制一个对象状态装换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同的状态的一系列类中。可以把复杂的逻辑简化。状态模式的结构图:先定义一个抽象状态类: abstract class State { public abstract void Handle(Context context); }ConcreteStateA、 ConcreteStateB:继承State class ConcreteStateA : State { public override void Handle(Co
阅读全文
摘要:观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者。当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。观察者结构图: 使用场景:老板回来通知员工需要进入工作状态。定义观察者的抽象类: abstract class Observer { protected string name; protected ISubject sub; public Observer(string name, ISubject sub) { this.name = name; this.sub
阅读全文
摘要:建造者模式:是在当创建复杂对象的算法,应该独立于改对象的组成部分以及它们的装配方式的使用模式,好处是使得建造者代码与表示代码分离。结构图:需要建造的对象(一般是复杂对象): class Product { IList<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("产品创建"); foreach (string part in parts) { Co
阅读全文
摘要:外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个借口使得这子系统容易使用。1、在设计初期阶段,应该要有意识的将不同的两层分离,比如考虑数据访问层、业务逻辑层、表示层之间建立外观模式,这样可以为子系统提供简单一致的接口,使得耦合大大降低。2、开发阶段,子系统内部由于不够重构变得非常复杂,增加外观模式可以屏蔽这个复杂性,并提供简单的接口。3、维护一个遗留的大型系统,代码不好再维护时,使用外观模式也是不错的选择。看看外观模式的结构图:Facade类定义:可以给高层系统提供简单的接口 class Facade { SubSystemOne one; SubSyste.
阅读全文
摘要:模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是通过把不变行为搬移到父类,去除子类中重复的代码来体现它的优势。模板方法模式提供了一个很好的代码复用的平台。结构图:AbstractClass定义: abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { Pr
阅读全文
摘要:原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象原型模式其实就是一个从一个对象再创建另一个可定制的对象,而且不需要知道任何创建细节,NET在System命名空间下,提供了ICloneable接口,实现这个接口完成原型模式。一般在初始化信息不变的时候,克隆是最好的办法。隐藏了创建对象的细节,性能也大大提高。MemberWiseClone(),复制仅仅对线程栈进行复制,是属于浅复制,要深复制,需要稍微修改代码。 一般人的简历是不变,需要多份,这个时候使用克隆模式比较好:简历类: class Resume : ICloneable { private string name;
阅读全文
摘要:工厂方法模式VS简单工厂模式简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类对于客户端来说,去除了与具体产品的依赖。工厂方法模式:定义了一个用于创建对象接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工厂方法模式实现时,客户端需要决定实例化哪一个工厂类来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂内容判断移到了客户端来判断。简单工厂主要的缺点是违背的开放-封闭原则。工厂方法模式结构图:调用模式的客户端代码: class Program { static void Main(string[] args) { C
阅读全文
摘要:代理模式:为其他对象提供一种代理以控制其他对象的访问。代理模式的应用:远程代理,为一个对象在不同的地址空间提供局部代表,可以隐藏一个对象存在于不同地质空间的事实。虚拟代理,根据需要创建开销很大的对象,通过代理来存放实例化需要很长时间的真实对象。安全代理,用来控制真实对象的访问权限。智能代理,当调用代理时,可以代理处理一些额外的功能。案例场景: 向一位自己心仪的女孩表达爱意,一般我们有两种选择:亲自出马(有自信的人)和 使用‘媒婆’(比较害羞)。其中使用‘媒婆’就是代理行为,我们实现如下:调用代理模式的主函数: class Program { static void Main(string[]
阅读全文
摘要:装饰者模式需要把所需的功能按照正确的顺序串联起来进行控制,动态的给一个对象添加一些额外的职责。装饰模式是利用SetComponent来对对象进行包装的,每一个装饰对象只需关心自己的功能,不需要关心如何被添加到对象链中。装饰模式是为已有功能动态添加其他功能的一种方式,优点是把类中的装饰功能从类中搬移,简化原有类,有效的把核心职责和装饰职责功能区分开来。调用装饰模式的主函数: static void Main(string[] args) { ConcreteComponent c = new ConcreteComponent();//核心功能类 ConcreteDecoratorA d1 =
阅读全文
摘要:设计模式中遵循的原则:单一职责、开放-封闭、依赖倒转单一职责原则一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的功能。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离,如果你能够想到多于一个动机去改变一个类,那么这个类就具有多个职责,这时就应该考虑类的职责分离。开放-封闭原则软件实体(类,模块)应该可以扩展,但是不可以修改。对于扩展是开发的,对于修改是封闭的。无论模块多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭作出
阅读全文
摘要:商场促销活动:打折、满额返现等等主函数对工厂模式和策略模式结合的调用: class Program { static void Main(string[] args) { //简单工厂模式 CashSuper csuper = CashFactory.CreateCashAccept("打8折"); float re = csuper.AcceptCash(100); //策略模式与简单工厂结合用法 CashContext csup = new CashContext("打8折"); float re1 = csup.GetResult(100); Co
阅读全文
浙公网安备 33010602011771号