设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 它主要有两层含义:其一它对应一个问题,其二它对应解决一个问题的最佳方法。 设计模式有什么作用呢? 为了代码可重用性,减少模块间耦合。 <1>创建型1.单例模式一个类只能有一个实例,这就是单例模式。 2.简单工厂一个工厂可以生产多个种类产品,这就是简单工厂模式。如一个饭店既可以做西红柿炒 鸡蛋这个菜也可以做酸辣土豆丝还可以做豆腐皮,这就是简单工厂模式的例子。 3.工厂方法一个工厂只能生产一类产品,这就是工厂方法模式。如鸡公煲店只能做鸡公煲这个菜, 排骨米饭店只能做排骨米饭,一个卖油饼的只能做油饼,馒头店只能做馒头等。 4.抽象工厂一个工厂只能生产一个系列或一个品牌产品,这就是抽象工厂模式。如海尔集团生产的 产品种类很多,但都是海尔牌子的,如电冰箱、洗衣机、彩电等,澳柯玛海信等也能生产电冰箱、洗衣机、彩电。 5.建造者模式生产一个产品或者组装一个产品需要很多步骤,把这些步骤封装,这就是建造者模式。 它分为抽象建造者、具体建造者、指导者角色。抽象建造者负责声明方法,具体建造者 实现这些方法,指导者调用具体建造者中方法。如你去科技市场组装一台电脑,老板就 是指导者角色,具体负责组装的员工就是具体建造者角色,是老板让员工去组装他才去 组装,也就是说有指导者调用具体建造者中的方法。 6.原型模式简单说就是复制模式。如孙悟空拿自己的一根头发可以生成一个孙悟空来,我们去复印 资料时候用的也是原型模式。 <2>结构型1.适配器模式把现有接口改变成客户需要的接口,这就是适配器模式。它有三个角色:源角色、目标 角色、适配器角色。适配器模式分为两类:类适配器和对象适配器。类适配器和对象适 配器都是有适配器将源角色转换成目标角色,但是方法不一样。类适配器继承源角色和 目标角色类,在目标角色方法中调用源角色方法,对象适配器光继承目标角色,但是需要 定义源角色变量,也是在目标角色方法中调用源角色方法来实现适配功能。 2.桥接模式桥接模式就是抽象部分和实现部分分开的一种设计模式,这里的抽象实现不是指的接口 和实现接口类的抽象实现,也不是抽象类和实现抽象类的类的抽象实现,而是指一个类 和类中的方法,类就是抽象部分,类中的方法就是实现部分,如果一个方法在类中有具 体实现,需求变更需要修改方法时候不符合开闭原则,所以把实现单独作为一个类,这 样需求有变更时不需要改变抽象类,只需要改变实现类就可以了,这样抽象和实现可以 独立变化了,减少了耦合。也就是说类中函数定义还是存在的,函数体调用别的类中的方法。 3.装饰者模式对一个元素进行装饰,就是装饰者模式。比如装修房子,比如新买了手机,安装了手机 壳和贴了钢化膜。装饰者模式实现时候需要调用被装饰者方法和调用装饰者自身方法。 4.代理模式有时候我们不想或者没有能力去干一件事情,就需要有人代替我们去干,这就是代理设 计模式。代理模式分为抽象主题角色、具体主题角色、代理角色。在实现时候代理模式 负责创建具体主题角色并调用具体主题角色中相关方法,当然也可能调用代理者自己方 法如果有的话。 5.组合模式组合模式处理简单对象和复杂对象的关系,两者接口必须一致。有两种方法设计接口, 按照复杂对象设计接口和按照简单对象设计接口。如果按照复杂对象设计接口有些方法 简单对象不需要,简单对象实现这些方法时候就得抛出错误,如果以简单对象设计接口 ,复杂对象中有些方法在接口中不存在,就需要单独在复杂对象中添加这些方法。 6.外观模式如果没有外观模式,客户端需要访问多个类,这样增加了代码量,不方便维护。外观模 式就是解决这些问题的,专门定义一个类去和各个类进行交互,客户端只需要访问这一 个类就可以了,这就是外观模式。 7.享元模式如果我们要去创建一个类,而现实中已经有类似的类了,只是类中方法参数不一样,其 它都是一样的,那么我们就不需要再创建类了,只需要修改完善以前类,把参数传递过去就 可以了。也就是说,在软件开发过程中,如果需要创建大量的细粒度类的实例,而这些 实例除了参数不一样外其它都是一样的,那么我们就可以把参数拿出来,需要时候给相 关方法传递参数就可以了。这就是享元设计模式。 <3>行为型1.备忘录模式用于备份数据。它又是怎样实现的呢? 备忘录模式分为备忘录角色、管理者角色、发起人角色。发起人创建备忘录并恢复备忘录数据,管理者保存备忘录,备忘录保存对象状态。 2.访问者模式元素和对元素的操作分开。如果元素比较稳定,操作可能有变化,可以使用这种模式, 这样操作有变化时候不用修改元素,减少了元素和操作的耦合度。 3.责任链模式一个请求需要多个审核就使用责任链模式。如请假,请假一天谁审批,请假3天谁审批 ,请假7天呢。 4.策略者模式一类问题,多个算法,每个问题对应一个算法。这时候就需要策略者模式,它是把算法 单独作为一个类。如税分个人所得税和企业所得税,这两个税的算法是不一样的,这时 候就需要用到策略者模式。 5.状态者模式元素状态不同,它对应的行为也不一样,如果不用状态模式呢,就会有很多if else语 句,如果有新的条件还得增加else语句,不符合开闭原则,所以就引入了状态者模式,另 外如果用平常方法元素状态改变了它对应行为也没法做到自动改变。状态者模式就是解 决这些问题的,状态者模式把元素和元素状态分离开了,元素状态单独作为一个类,元 素的行为有状态类实现,这样元素状态改变时候将会自动改变元素对应行为。状态者模式有元素角色、抽象状态、具体状态组成,如果需要增加一个状态,只需要增加一个具体状态就可以了,满足了开闭原则。 6.中介者模式我们通过中介来干一件事情。比如我们通过微信、QQ和好友聊天,这个微信和QQ就扮演 着中介角色,再举个例子,房产中介也是中介者模式例子。为什么要使用中介者模式呢, 因为干有些事情我们不专业、有风险或者别的原因。 7.观察者模式比如订阅号,订阅号有新的内容更新,会通知所有关注了这个订阅号的人,这就是观察 者模式。 8.迭代器模式什么是迭代器模式呢?迭代器模式就是列表和对列表的操作分开了,对列表操作单独作 为一个类存在。这样做有什么好处呢?如果不用迭代器模式当然也可以对列表进行操作 ,但是会暴露列表内部数据。迭代器模式好处就是既不影响访问列表数据,又不会暴露 列表内部数据。 9.命令模式命令模式就是发布命令时候用到的一个设计模式。它主要分为抽象命令角色、具体命令 角色、接收者角色、请求者角色、发起人角色。接收者就是需要谁执行命令,请求者就 是具体发布命令的人,发起人就是谁让请求者发的命令。举个例子,一个大学的校长需要 发布个命令“9月10日有个全体学生的会议”,就需要各个班主任通知各个班同学,那么校 长就是发起人,各班班主任就是请求者,学生就是接收者。发起人调用请求者方法,请 求者调用命令中方法,命令调用接收者方法。 10.模板方法模式我们想要干一件事情,如果有现成模板,我们就可以使用,这就是模板设计模式。模板 中有些方法是固定的不能改,有些是可以改变的。举个例子,我们从网上下载个简历, 简历样式我们不能改,改了就不是模板了,但是有些内容需要换成我们自己的,这就是 模板设计模式。 |
|