设计模式-Design Pattern
文章平均质量分 70
分享设计模式的个人见解
WongKyunban
这个作者很懒,什么都没留下…
展开
-
设计模式——模板方法模式
模板方法模式定义在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使用得子类可以在不改变算法结构的情况,重新定义算法中的某些步骤。类图:AbstractClass:这个抽象的类包含了模板方法。模板方法在实现算法的过程中,乃至了两个抽象操作,模板方法本身和这两个操作的具体实现之间被解耦了。ConcreteClass:这个具体类实现抽象的操作,当模板方法需要这两个抽象方法时,...原创 2019-04-01 15:37:25 · 1461 阅读 · 0 评论 -
设计模式——命令模式
命令模式定义将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。...原创 2019-04-01 00:40:46 · 1479 阅读 · 0 评论 -
设计模式——状态模式
策略模式是围绕可以互换的算法来创建的。状态模式是通过改变对象内部的状态来帮助对象控制自己的行为。状态模式定义允许对象在内部状态改变时改变它的行为。这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,行为会随着内部状态的改变而改变。状态模式的类图:类图解析:State:State接口定义了一个所有具体状态的共同接口;任何状态都要实现这个相同的接口,这样一来,状态之间可以互...原创 2019-03-28 16:40:34 · 1444 阅读 · 0 评论 -
DIP依赖反转原则——实现松耦合的设计
在《IoC控制反转设计原则——实现松耦合》一文中,我们已经学习了如何用工厂模式实现IoC(控制反转)原则,达到了松耦合设计第一步。再实现DIP(Dependency Inversion Principle 依赖反转原则)达到松耦合的设计的第二步。往下看,你就明白了。1.什么是DIP?高层级模块不应该依赖低层级模块。两者都应该依赖于抽象。抽象不应该依赖细节,而细节应该依赖抽象。我们用一个例子来说明。public class CustomerBusinessLogic{ public原创 2020-11-02 09:37:19 · 1922 阅读 · 0 评论 -
代理模式——虚拟代理(二)
代理模式定义为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。代理分三种:1.远程代理,帮助我们控制访问远程对象:远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。...原创 2019-03-19 17:10:58 · 3615 阅读 · 0 评论 -
设计模式——迭代器模式
当我们说“集合(collection)”的时候,我们指的是一群对象。其存储方式是各式各样的数据结构,如列表、数组、散列表,无论用什么方式存储,一律可以视为集合。迭代器模式定义提供一种方法顺序访问一个集合对象的各个元素,而又不暴露其内部的表示。这个模式给我们提供了一种方法,可以顺序访问一个集合对象中的元素,而又不用知道内部是如何表示的。类图:Iterator是所有迭代器都必须实现的接口,...原创 2019-03-27 18:15:18 · 1440 阅读 · 0 评论 -
DI依赖注入设计模式
《DIP依赖反转原则——实现松耦合的设计》我们通过创建和使用抽象实现了DIP原则,进一步获得松耦合设计。本单将使用依整注入(DI)设计模式来将依赖的对象的创建彻底移出类外面去,以获得完全的松耦合的程序设计。依整注入是一种设计模式。它实现了IOC反转控制原则。它将依赖的类的创建在类外面实现,再通过注入的方式将创建好的类注入。比如说,A类依赖B类,那么我们先在A类外面,创建好B类,再将其注入到A类中。注入的方式有三种,在讲它们之间,我们规范上各个类的称呼,比如说上面说的A类,我们称其为Client类,B类原创 2020-11-02 10:59:09 · 2264 阅读 · 0 评论 -
策略模式
通过学习设计模式,你将学到如何利用其他开发人员的经验与智慧。使用设计模式的最好方式是“把设计模式装进脑袋里,然后在你的设计和已有的应用中,寻找何处可以使用它们”。今天我们要讲的就是策略模式,代码在Github上了:看看UML:策略模式的定义定义了算法族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于算法的客户(父类,使用算法的类)。我们不再说鸟的一系列行为,如飞、鸣叫,是“...原创 2019-03-08 12:40:56 · 1063 阅读 · 0 评论 -
MVP设计模式
Model–view–presenter (MVP) 是model–view–controller (MVC)设计模式派生出来的。MVP经常用来创建用户界面。presenter是作为一个“中间人”的角色存在。在MVP中,所有页面显示逻辑都会被推送到presenter。以下这张图是MVC模式的:MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过...原创 2019-04-10 20:24:26 · 9953 阅读 · 0 评论 -
Android MVP设计模式最佳实现
Android MVP设计模式最佳实现1.概述2.MVP的工作过程3.MVP架构的层:Model、View、Presenter3.1.Model3.2.Presenter3.3.View4.Model、View、Presenter依赖关系5.MVP Demo5.1. 界面5.2.创建User实体类5.3.创建Model、View、Presenter接口LoginActivityMVP5.4.实现Model、View、Presenter接口5.4.1.实现Model接口5.4.2.实现Presenter接口5原创 2020-09-24 23:03:06 · 2032 阅读 · 0 评论 -
设计模式——外观模式
外观模式,将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。外观简化了接口,也将客户从组件的子系统中解耦。外观和适配器都可以包装许多类,但是意图是不一样的,外观是为了简化接口,而适配器是为了将接口转换成不同的接口。外观模式定义提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式的类图:外观模式会减少软件的维护成本,但是也...原创 2019-03-26 17:45:59 · 1373 阅读 · 0 评论 -
设计模式——组合模式
组合模式的定义允许你将对象组合成树形结构来表现“整体/部分“层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。讲解时,我们用图形界面上的菜单例子来举例说明。组合模式的类图:类图解析:Client:客户对象将使用组件接口访问菜单和菜单项Component:提供了一组接口,让菜单项和菜单共同使用,并且提供了默认实现。但是我们希望由具体的菜单或菜单项提供默认实现,因此我们使用了抽...原创 2019-03-28 12:52:28 · 1396 阅读 · 0 评论 -
单例模式
有一些对象其实我们只需要一个就够了,比如线程池、缓存、对话框、处理偏好设置、注册表的对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。如果制造出多个,反而会导致许多问题。单例模式定义确保一个类只有一个实例,并提供一个全局访问点。经典的单例模式实现第一步:利用一个静态变量来记录Singleton类的唯一实例。第二步:把构造器声明为私有的,只有在Singleton类内才可以调用构造器。...原创 2019-03-16 23:19:53 · 1242 阅读 · 0 评论 -
Dagger2——DI依赖注入——IOC原则的实现者
《如何获得完全松耦合的程序设计》IoC原则、DIP原则、DI设计模式可以帮助我们获得完全松耦合的程序设计。而Dagger2则是实现了依赖注入(DI)设计模式的框架,也就是它实现了IoC原则。简而言之,Dagger2在遵循IoC原则下帮助我们创建依赖对象。我大概讲一下DI设计模式:比说A类依赖B类,那么我们通过在A类外面创建B类的对象,再将其注入A类。需要有个第三方帮我们把这件事做了(IoC的体现),那么Dagger2就是这个第三方。Dagger2是基于java规范要求,使用注解的方式生成代码。我们通过原创 2020-11-02 17:58:55 · 1871 阅读 · 0 评论 -
工厂模式
针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。如果一个类中使用大量new出来的具体类,那么就等于是自找麻烦,因为一旦加入新的具体类,就必须修改代码。我们可以将new的工作,交给一个对象去做,这个对象被我们称为“工厂”。工厂(factory)处理创建对象的细节。把创建工作交给一个对象来处理的好处就是日后要修改时,只需要修改这个类即可。我们很喜欢利用静态方法定义一个工厂,通常称为“静态工...原创 2019-03-15 19:51:29 · 1259 阅读 · 0 评论 -
如何获得完全松耦合的程序设计
以下面这三篇文章也许可以提供些思路:1. 《IoC控制反转设计原则——实现松耦合》2. 《DIP依赖反转原则——实现松耦合的设计》《DI依赖注入设计模式》原创 2020-11-02 14:37:11 · 1980 阅读 · 0 评论 -
观察者模式
我们先看看报纸和杂志的订阅是怎么一回事。(1)报社的业务就是出版报纸(2)只要你向报社订阅报纸,你就会一直收到新报纸(3)当你不想再看报纸时,你可以取消订阅,他们就会停止向你送新报纸(4)只要报社没有倒闭,就会一直有人向他们订阅或取消订阅报纸所以出版者+订阅者 = 观察者模式在观察者模式中,出版者被叫做“主题(Subject)”,订阅者被叫做“观察者(...原创 2019-03-14 18:05:26 · 1313 阅读 · 0 评论 -
IoC控制反转设计原则——实现松耦合
IOC是一种设计原则(虽然,有很多人将它当成是一种设计模式)。正如IOC(控制的反转)的名字一样,IoC被用来反转不同类型的控制在面向对象设计中获得松耦合。这里的控制指的是类拥有的除了主要职责的其他的职责。这包括对应用程序流的控制,对象创建或依赖的对象创建绑定的流的控制。打个比方说,你开车去上班,意味着你控制着车。IOC原则则建议你反转控制,意味着不是你自己开车,你可以租一辆出租车,让另外一个人来开,这就是所谓的控制反转,这样一来,你就不用再管控制车的任何操作,让司机去控制,你就可以专心做自己的事了。I原创 2020-10-13 09:33:32 · 2081 阅读 · 0 评论 -
代理模式——远程代理(一)
代理模式定义为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。代理分三种:远程代理,帮助我们控制访问远程对象:远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。虚...原创 2019-03-19 14:33:20 · 5347 阅读 · 0 评论 -
android MVP+Dagger2
《Android MVP设计模式最佳实现》,我们在这篇文章的基础上加上Dagger2后应用。为什么要这样做呢?第一,MVP的结构模式,已让我们获得了一个不错的可维护、易于维护的结构。而用Dagger2而是为了使用我们的程序设计变得更加松耦合。参考《什么是Dagger2?》1.创建LoginModule、AppModule:提供注入对象@Modulepublic class LoginModule { @Provides public LoginActivityMVP.Present原创 2020-11-02 23:21:07 · 2119 阅读 · 0 评论 -
代理模式——保护代理(三)
Java在java.lang.reflect包中有自己的代理支持,利用这个包我们可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类(继承了InvocationHandler的处理器类),因为实际的代理类是在运行时创建的,我们称这个java技术为:动态代理。在代码开始执行时,还没有proxy类,它是根据需要从我们传入的接口集创建的。从Java1.2开始RMI可以...原创 2019-03-25 18:39:35 · 3052 阅读 · 0 评论 -
设计模式——适配器模式
在生活中,如果我们在香港买了三脚插头回到内地来用,你会发现根据没有插座可以插。因为内地用的电气标准与香港的不一样。那么我们该怎么办?这时我们可以买一个适配器。这样一来香港买的三脚插头就可以插在这一个适配器上,适配器的另一头可以插在内地使用的普通插座上,这样就可以使用了。从上面这个生活例子,我们可以看出适配器改变了三脚插头,使其符合内地的使用需求。在面向对象的适配器也是一样的:将一个接口(被适配...原创 2019-03-26 12:14:43 · 1537 阅读 · 0 评论 -
装饰者模式
开个头原创 2019-03-11 16:05:23 · 1121 阅读 · 0 评论 -
SOLID 原则
其实,外国人喜欢把一些重要且普遍或大力宣传让特定群体知道的东西弄成某几个单词或句子的首字母组成一个新的“词”,而这个词一般人是无法从字面上去理解,也不可能,因为它是纯粹的字母,根本没有什么特殊的意思,必须额外的脑补很多这些知识,你必须去找出它们原来是哪些单词才有可能知道它的意思。这也是汉语的神奇之处,哪怕是新词,也能通过组词把它的意思呈现出来。所以SOLID也是这样来的,SOLID如果不在软件行业里的话,真的很难知道什么是SOLID principle,它其实是软件设计的五大原则:原则1:Single原创 2022-05-21 01:38:59 · 780 阅读 · 0 评论 -
单例模式-LayoutInflater
前言在Android系统中,我们通常会通过上下文对象Context获取一些系统级别的服务。而这些服务会在适当的时候以单例的形式注册在系统中,那么我们就可以通过Context的getSystemService(String name)获取。以下的源码是Android8.0 API 26。LayoutInflater今天我们来看一下Android源码中的设计模式之单例模式。我们来讲一讲我们经常...原创 2020-01-07 11:51:15 · 1876 阅读 · 0 评论 -
再聊:依赖注入(Dependency injection)
依赖注入是解决一个对象如何获得它依赖的其他对象的技术。例如,一个对象A可以通过注入器(Injector)获得它所依赖的其他对象B、C。其中B、C对象是A对象的依赖(Dependencies)被传入到A对象中,一般被称为Service,A作为接收对象一般叫Client,而负责将依赖传递入接收对象的代码叫做Injector。因此我们可以看到Client具体使用什么Service是由Injector去指定的,并传入到Client中,而不是Client自己去指定或创建的,这一点也是依赖注入的基本要求。** 依赖原创 2022-01-14 23:39:31 · 1307 阅读 · 0 评论 -
面向对象设计的六大原则
1、单一职责原则(Single Responsibility Principle)一个类中应该是一组相关性很高的函数、数据的封装。2、开闭原则(Open Close Principle)它能够指导我们建立一个稳定的、灵活的系统。软件中的对象(类、模块、函数等)对于扩展是开放的,但是对于修改是封闭的。因为扩展只是增加新的类、函数、模块等,不会影响原有的功能,但是修改就有可能会动到以前的逻辑从而...原创 2019-12-09 23:56:18 · 1998 阅读 · 0 评论