关于设计模式的理解

#创建型模式

工厂方法模式

我们需要向用户提供接口,但是接口中不能存在构造方法,故用工厂方法来提供构造器。我们并不希望用户知道我们的内部类实现,所以用工厂方法提供构造器。

工厂方法:定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到子类。(即定义一个接口(构造产品接口类),具体实例化的类(实现产品接口子类型的构造方法)继承该接口,重写具体构造方法,需要创建哪个,就调用哪个具体的构造类。)
注:工厂接口中可以包括其他方法。
具体实现类可以用static静态函数来创建对象,因为工厂创建一个产品是针对所有类都可以的,不需要特定的界限。

#结构型模式

1.适配器模式
主要是解决类之间接口不兼容的问题。
通过增加一个接口,将已存在的子类封装起来,用户面向接口编程,隐藏具体子类。

用户需要的类与存在的类类型不兼容,则可以定义一个接口,包含用户需要的此方法,然后用一个具体实现类继承这个接口,方法中委托已存在的类,修改用户参数,使参数与已存在类匹配,且与用户需求一致。(相当于加了个中转,使得能够调用已存在方法。)

2.装饰器模式

为需要被装饰的类去增加不同侧面的特性。
对每一个特性构造子类,通过委派机制增加到对象上。

让父类装饰类继承具体类实现的那个接口,父类装饰类是具体类(待装饰类)的副本,因此定义一个属性,通过委派属性将接口所有的方法实现即可。
具体要装饰的特性分别实现在每一个子类中,需要装饰的方法则在子类中重写即可,特性方法也可以写入,但是注意有可能调用不到。

#行为型模式

1.策略模式

有多种不同的算法来实现同一个任务,但需要用户根据需要动态切换算法,而不是写死在代码里。
为不同的实现算法构造抽象接口,利用委派,运行时动态传入用户倾向的算法实例。

有多种方式完成同一种任务,把此任务放进一个接口里,让每个方式一个类去实现这个接口,用户需要哪个就实例化哪个即可。

2.模板模式

做事情的步骤一样,但是具体方法不同。
共性步骤在抽象类内公共实现,差异化步骤在各个子类中实现。模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。

3.迭代器模式

客户端希望对放入容器/集合类的一组ADT对象进行遍历访问,而无需关心容器的具体类型。不管对象被放在哪里,采用相同遍历方式。

具体类中定义一个返回Iterator的方法,并实现iterable。
写一个实现iterator接口的类,实现遍历该具体类的各种方法。

4.visitor模式

为ADT预留一个接入点,外部实现的功能代码可以在不改变ADT本身的情况下在需要时通过委派接入ADT。

就相当于委派一个visitor去帮助该ADT扩展想要的功能。
定义一个有accept(visitor v)方法的接口,需要接入点的类实现该接口。
创建visitor接口,接口中有需要接入的方法。具体接入方法定义在具体类中,具体类实现visitor接口。

#不同设计模式的对比:

共性样式:

1.只使用继承,不使用委派。(核心思路:OCP/DIP)
模式:最传统的策略模式,模板模式。

适配器模式(归在这里稍牵强…用了委派):核心思路:OCP
只扩展,别修改。故扩展一个接口,一个具体类委派原类。

模板模式:抽象类作为一个框架,其他类继承。

2.两颗继承树,两个层次的委派。
模式:策略模式,迭代器模式,工厂模式,visitor模式。

策略模式:同时要完成两个任务时候,两个任务还有对应关系,那么用两颗继承树。OCP原则。

迭代器模式:设计集合,iterator两种对象。

工厂模式:工厂和产品。

visitor模式:visitor和需要接入的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值