23种设计模式思想

变化当中有稳定的部分才会引入设计模式

0.简单工厂模式:

这其实不算是设计模式,只是一种编码习惯。相当于if..else.. switch..case..

比如做一个计算器时,type == “+”那么执行两个变量相加。

type == “-”执行两个变量相减

意图:通过一个方法,一个参数,执行不同的逻辑

1.工厂方法模式:

比如:公司新来俩程序员一个搞android的,一个搞ios的,第一天。老板叫你俩赶紧把环境配好。

所有程序员都有(都实现了)配环境的这个技能(这个就可以抽象出来一个接口,待实现的方法为配环境。)。

老板只需要new出来1个android程序员,1个ios然后让这俩程序员去执行的配环境的方法。就可以让android配android studio。ios去配xcode。

意图:抽象出俩个程序员的共同属性为一个interface,然后两个程序员分别都实现这个interface,

new android程序必定执行他自己实现的(配置android studio的技能)

2.抽象工厂模式:

抽象工厂其实就是同一个接口中有多个待实现的方法。

比如说上面的2个程序员同时还具备另外一个共同的能力,划水。

现在他们都实现了,配环境,和划水两大技能。

android划水的时候去看电影,ios划水的时候去看新闻。

那么此时就变成了抽象工厂模式。

new 出来一个android程序员,他必然具备配置android studio和看电影的技能。

你就可以调用这些技能。

3.单例模式:

单例模式怎么保证线程安全,为什么要双重校验,怎么防止反射攻击都需要去了解下,这里只讲思想

比如说:Android上的webview,实例化一个过程比较慢,占用内存cpu又比较高,那么就可以全局实例化唯一一个webview。需要的时候拿过来用就好了。

意图:让全局只能获得某个类唯一的对象。

4.建造者模式:

比如:我现在需要一个孩子,必须要 男人,女人, 买房,结婚, 这几个条件。

当然可以new Baby(男人, 买房 ,女人,结婚) 。这样也能得到一个孩子,但是无法看到步骤,也容易造成顺序错乱,(个人理解建造者模式就是这个作用)有时候必须要有个顺序。比如必须要买了房,才有女人。

所以你可以 new babyBuilder;babybuild.add(男人).add(房子).add(女人).add(结婚)

然后babyBuilder.build就出来一个孩子。

意图:把一个对象创建需要的参数,一步一步写出来,表现出来。再点击build进行创建

5.原型模式

原型模式涉及的普通变量比说int,long,string...都是深拷贝,可以放心使用,但是对象,以及对象内部的对象,以及各种list都是浅拷贝,需要自己及其内部的复杂子类实现 cloneable接口,重写clone方法,完成深拷贝

比如:要创建一个电脑需要鼠标,键盘,显示器,主机。现在有需求,需要另外1台跟他一模一样的电脑,,你当然可以再new一台出来。

还有个办法就是电脑这个类实现,cloneable方法,内容是调用3d打印,返回的是电脑

那么你只需要拿旧的电脑,调用cloneable方法,就通过3d打印出了一个新的电脑。

意图:让一个复杂对象,提供快速出一个一模一样的复制品的方法

6.享元模式

比如:你有个手机,用了很多年了,不卡,只是想换个更新的手机

这时候,你妈正想买一个跟你这个一样的手机,你只需恢复出厂设置,把各种照片,短信,清空,就可以拿给你妈继续用了。把对象内的变量全部赋初始值。

意图:尽量复用一个对象,减少创建对象时候的内存,cpu等开销

7.门面模式\外观模式

比如:你的应用里有需要网络请求的地方,你可以选择xUtils、HttpUrlConnection、okHttp等等。

如果你直接使用这些第三方库,在之后的更新换代中,如果要修改网络请求库,那么你就得每个地方都去修改一下了。

这个时候你就可以用门面模式,封装一层,这个类叫MyHttpUtils。并在这个类里面,调用xutils,或者okhttp的get,post请求方法。在外部调用的时候只使用MyHttpUtils.getxxx()、MyHttpUtils.postxxx()

意图:提供一个额外的封装,方便我们使用和更换内部的子系统。

8.适配器模式

比如:插板这个对象只会给我们提供220v的电压,但是我们的手机只能接收5v的电压。这个时候就需要一个电源适配器。

1.拿到220v的对象,2.进行一系列的转换操作,3.返回一个5v的电压。

具体使用办法

a.实例化一个电源对象,他内部具有输出220v电流的方法(outPut220)。

b.实例化一个手机适配器,实现目标接口(这里是输出5v电压待实现方法outPut5)构造函数中传入电源对象

c.在适配器的outPut5方法中,调用电源对象的outPut220,获得220的电压。再通过一系列的操作后把220v变成5v。返回5v电压

d.调用手机适配器的outPut5方法

意图:将一个类的接口转换成客户希望的另一个接口,adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作

9.装饰者模式

比如:一个拍照功能,做起来非常复杂,他现在唯一的功能就是拍照,我们现在想给他添加一个美颜功能。就需要在不改变拍照功能的前提下,添加上去。符合开闭原则。

实现方法:

1.定义一个接口interface Carmera,里面只有takePhoto这个方法。

2.定义一个类OldCarmera实现这个接口,重写takephoto方法,为原始拍照功能

3.定义一个抽象类 FaceCarmera实现carmera接口,构造函数传入Carmera的实例化对象(这一步可以省略,反正就是得到Old对象,调用old对象的拍照方法,再执行美颜方法就行)

4.定义一个类BeautyCarmera继承 FaceCarmera,构造方法中传入Carmera的实例化对象

5.在BeautyCarmera先调用传入对象的takePhoto方法,在执行自己实现的美颜功能

6.使用的时候,使用Carmera类型 mCarmera接受赋值,创建一个BeautyCarmera对象,参数是一个OldCarmera对象。再调用mCarmera的takePhoto方法

意图:在不改变原有对象的基础上,把功能附加到对象上

10.策略模式

比如一个班有20个学生,现在需要对他们进行排序,有两种策略一个是按身高排,一个是按体重排序。

Arrays.sort(students,xxxComparator);

定义一个HeightComparator 实现 Comparator<Student>。并重写compare方法

定义一个WeightComparator 实现 Comparator<Student>。并重写compare方法

最常见的例子就是Arrays.sort方法,

意图:定义一系列算法,并把它们一个个封装起来,并且是他们可以相互替代。

11.模板方法模式

跟工厂方法类似,也是把一部分代码延迟到子类去执行。工厂方法更侧重用在子类实例化一个对象。

比如:一个操作数据库操作,有打开数据库,执行sql,关闭数据库3个操作

就可以定义一个父类,定义一个opration方法,里面 执行 open,exec,close方法。

open和close方法由父类实现,但是exec方法为空或者为抽象方法,交给子类去实现。

意图:定义一个算法骨架,把其中一些步骤延迟到子类执行。使得不改变算法结构各个子类可以重写某些特定的步骤

12.观察者模式

在java中一般是通过接口来实现观察者。

比如android中常用的onclicklistener(点击事件监听)主要步骤3步。

1.在得到一个按钮后,setOnClickListener(xxx)。

2.在Button内部,把传入的onclicklistenerxxx保存下来。

3.当触发点击事件的时候,Button内部会执行onclicklistenerxxx.onclick方法。

意图:当某个对象的状态改变时,可以通知他所依赖的对象。这里即为按钮被点击时,通过传入的onclicklistener,通知外部onclicklistener的实现类。

13.责任链模式

一般通过数据或者链表的形式实现。通常有2个对象 request 和 handler。请求对象和处理对象。

比如:一个http请求(request对象),在服务端可以分为以下3个步骤

1.判断请求屏蔽是否过高,checkTimes()

2.判断是否登录状态,checkLogin()

3.判断是否有对应查看权限,checkPermission()

4.如果都为true,则执行业务逻辑,exec()

这种情况当然可以使用一个方法.里面同时执行这4个方法,并依次判断每个方法的返回值。但是这样耦合性比较高。

这时候就可以使用责任链模式,每一个处理单元都是一个类的实例,这个实例中里包含下一个处理单元,当前处理单元处理完毕时,通过返回值来确定是否执行下一个处理单元。

1.定义一个抽象类Handler,有一个属性next,类型也是Handler。有一个抽象方法,

boolean process(Request request).

2.在定义另外3个类,TimesHandler,LoginHandler...继承Handler。并且构造函数为 Handler :next

3.分别在对应类的process方法里。先处理request应该执行的逻辑,比如判断频率,并根据返回值再做处理

false直接返回,结束了。

true,执行next的process方法。同时,判断next.process方法,如果为false也返回。如果为true,就返回true。

4.并且还需要判断next是否为null,为null代表处于最后的责任链了。

5.调用时,拿到request对象。

实例化 tHandler = new TimerHandler(new LoginHandler(new PermissionHandler))

tHandler.process(request).

意图:把每一个处理逻辑都提升到类的级别,解耦,并且方便拓展

中介者模式:

同事类A 和 同事类B 不直接发生调用关系,而是是通过中介者进行交互。

比如买房子有买家 卖家 中介。买家和卖家就是同事类。

买家 的 买房子的方法,是调用中介的买房方法,中介在根据你的需求和预算去找相应的卖家买,买到后,把你的名字写到原本的房产证上,一次交易就完成了。

这里的中介者格外重要,他要持有买家和卖家对象,以及交互的方法。

比如android的MVP模式,presenter就持有activity和model的对象,以及很多交互方法。

实现方法多种多样,核心就是,有一个中介者持有多个同事类对象,并把同事A,B之间的直接交互,变成间接交互达到解耦的目的

代理模式:

代理模式和外观模式适配器模式都有一些类似。但是核心思想不同。

代理模式主要用作在对某个类请求时需要做一些控制时,中间增加的一层代理。

比如,你要买票,不可能大家都去火车站买,这样火车站就挤爆了,这个时候就可以在每个城市多设置几个代理点,需要买票的都去代理点买,这样就控制了人流。更多的还可以对安全性进行控制。

实现方式,再服务和客户之间增加一层代理层,接收客户的请求,校验处理后,再交给服务处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值