文章分类 - 设计模式
摘要:eg: 公司同事吵股票 让前台 放哨,老总到时,打电话通知,开始继续工作。1.双向耦合代码前台需要知道被通知的同事,同事需要知道前台的状态,所以相互包含问题1.如果有部分同事看NBA,不是吵股票,则需要改变前台和同事的状态此时,抽象出观察者,继承出各种从事不同活动的观察者(同事),利用多态,执行响应的操作。遗留问题:具体观察者中仍然是相互耦合的。2.增加1个通知者抽象类(前台)这样将耦合的双方依赖于抽象,而不是依赖于具体。符合依赖倒转原则。3.事件委托实现。如果去掉抽象观察类,如何弥补不同的操作(多态)声明委托,包含在具体的通知者类里。将不同观察者的对象的具体操作都添加到委托实例里面,所有的方
阅读全文
摘要:游戏存档eg:class 游戏角色{ 各种属性}保存状态,产生一个bakeup游戏角色,将当前的游戏角色的状态赋给backup,恢复时,就用backup恢复。游戏状态等细节都暴露出来,不合理,同时更改保存的细节时,会影响到客户端解决:使用备忘录模式class 游戏角色{ 各种属性 SaveState(){ new 备忘录;//将各种状态细节赋值封装在本类里面,这样不会暴露,也不会影响到客户端。}}角色状态储存类 备忘录类 完成具体的状态储存//可在构造函数中完成角色状态管理者,内部维护一个备忘录类的对象
阅读全文
摘要:将问题的各个实例表述为一个句子,构造1个解释器,对该句子进行解析,就像脚本一样。eg://演奏内容class PlayContext{private string text;//演奏文本public string PlayText//定义类,不定义也可以{ get(){return text}; set(string value){text = value};}}abstract class Expression //抽象解释器{public void Interpret(PlayContext context){ //从 context.PlayText获取 key和Value Excute
阅读全文
摘要:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将这个对象练成一条链,沿着这条链传递该请求,知道有一个对象处理它为止,简化对象的相互连接。用户并不知道这当中的哪个对象最终处理这个请求。abstract class Handler{ protectd Handler successor; public void SetSuccessor(Handler successor) // 设置继任者,相当于接口规范 { this.successor= successor; }}class Handler1 : Handler{ public: ProcessRequest(Reque
阅读全文
摘要:行为请求者和行为实现者紧耦合eg: 烧烤摊对请求排队或者记录请求日志,以及支持科撤销的操作,上述实现不太合适,可以考虑命令模式。eg: 烧烤店请求的命令可能是各种各样的,因此抽象1个命令类。public abstract class command{ protected Barbecuer recevier;//确定 烧烤者是谁,实际应用者上也不需要指定 public command(Barbecuer recevier)//在构造函数时导入,可以SetBarbecuer(Barbecuer recevier) { this.receiver = receiver; }//执行不同的命令 a.
阅读全文
摘要:对象的继承关系在编译前就已经确定好了,如果继承下来的实现不适合解决问题,则父类必须重写或者被替换。优先使用合成/聚合原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减小他们之间的耦合。例如手机 可以按照 品牌分类,也可以按照软件 分类手机品牌 ---------------------手机软件abstract class HandSoft //手机软件{ public abstract void Run();}//按照手机软件分类//手机游戏class HandSetGame : HandSoft{ public override void R
阅读全文
摘要:当提供的接口与复用环境要求不一致,同时所做事情相同时,可以考虑适配器模式,这样客户代码可以统一调用同一个接口。class Target //目标接口{ public virtual void Request();}class Adaptee //提供的接口,需要适配{ public void SpecificRequest();}class Adapter: Target{ private Adaptee adaptee = new Adaptee();// 建立一个私有对象,Adapter的接口实现 调用该对象 public override void Request()//接口保持一致{
阅读全文
摘要:1.当存在部分与整体的关系时,可以用组合方式。2.组合模式可以对单个对象和组合对象的使用具有一致性。因为两者都继承同一个抽象类。leaf composite component
阅读全文
摘要:1.规范被建造对象的各个部分指定的抽象接口,具体的建造对象由各个子类去实现。2.用户需要什么样的对象,直接交给指挥官,指挥官内部有维护建造者的抽象对象,完成相应的构造。将构造和用户分离。
阅读全文
摘要:例如:用户买股票,需要与各种股票打交道,整个交互过程很复杂,基金实际上是由职业经理人将用户的钱选择性购买各种股票,这样用户只需要跟基金打交道,不需要与各个股票打交道,简化交易过程。外观模式就是将子系统中的一组接口提供一个一致的界面,使得子系统更容易被调用。
阅读全文
摘要:简单工厂模式,将生成具体的对象逻辑判断放在了工厂中。当要添加新的产品时,需要添加新类外,还要修改工厂内部的方法。虽然实现了扩展,但是破坏了封闭更改原则。工厂模式,为各个子类都建了工厂类,将逻辑判断放在了客户端。eg: 产生加法工厂,付给抽象工厂。用加法工厂产生加法类,再使用加法类的方法
阅读全文
摘要:代理模式:通过中间代理完成,实际上还是调用了发送方的方法。1.规范接口类,规范了发送方和代理都有的方法2.发送方和代理都是实现接口,其中,代理方法的实现就是直接调用了发送方的方法。
阅读全文
摘要:一共23种设计模式!按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)建造者模式(Builder Pattern搜索)原型模式(Prototype Pattern)单例模式(Singleton Pattern)结构型模式用来处理类或者对象的组合,主要包含以下7种设
阅读全文
摘要:1.该模式用于对一个对象添加一些额外的职责.1.虽然用继承的方法也能扩展额外的职责,但是当职责多时,需要的子类就很多2.特别是这些职责有顺序时,组合的个数就越多.因此,该模式比生成子类的方法要灵活的多.Abstact class Component;class Decorator : Component{ Component component;//被用来装饰的构件void SetComponent(Component out) // 由外面导入具体构件{this->component = out ;} Operation(){ component.Operation();//导入构件的
阅读全文
摘要:1.单一原则每个类尽量使其功能单一,不要随意将各种方法添加进去,降低耦合度,依赖关系。使得各个类之间各自独立,相互修改不产生影响,代码可以复用。例如:窗口类,在各个事件代码中就加入各种游戏逻辑代码。应该将游戏逻辑专门抽象出一个类,即使其它平台,游戏类也可以复用。2.开放扩展-封闭更改系统总是围绕需求更改的,需求不是一成不变的,因此,只有尽可能扩展,才能保持系统的稳定性。如何实现尽可能的扩展,则需要尽可能抽象,以应对不同的变化。3.依赖倒转抽象不应该依赖细节,细节依赖与抽象,即针对接口编程,不要对实现编程。高层模块 -> 接口或者抽象类 <- 底层模块4.合成/聚合复用原则优先使用对
阅读全文
摘要:1.策略模式类似于简单工厂,策略模式针对算法,但是算法完成的任务相同,只是实现不同,它可以以相同的方式调用所有的算法,而简单工厂针对产生对象。2.策略模式: 上下文类包含一个维护策略抽象类对象,需要哪种策略,就产生哪种策略。class Strategy{virtual double action() = 0;};class Strategy1 : Strategy;class Strategy2 : Strategy2;class Context{private: Strategy m_strategy; Context(Strategy tmp) { m_strategy = tmp...
阅读全文
摘要:简单工厂特点:1.简单工厂能产生各种不同种类的产品,但是这些种类最终通常继承同一个基类。2.简单工厂方法(通常为static)通常返回一个基类对象,通过该对象,利用虚函数,多态性,可以控制各个子类的操作行为。优点:1.需要其它不同的子类时,直接在工厂中添加,不会影响其它子类。2.简单工厂通常用来产生不同的对象。eg:class Parent{public:virtual action() = 0;}class Child1 : Parent;class Child2 : Parent;class Child3 : Parent;class Factory{static Parent Cre..
阅读全文
摘要:单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码显的很不优雅。 使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然能创建相同类的本地实例。《设计模式》一书中给出了一种很不错的实现,定义一个单例类,
阅读全文