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