android设计模式二十三式(一)——设计模式规则

今天开始系统做一下设计模式的内容,将设计模式融入到自己的项目中,就是有指导思想的去编程,可以让你像站在一个沙盘旁边的将军一样,指点江山,总体上把我项目的结构设计。

总体来说设计模式分为三大类:

创建型模式五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式遵循六大原则

1.单一职责原则(Single Responsibility Principle, SRP):

一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

意思就是,一个类,不应该负责太多的功能,举个例子,以前家庭主妇,要洗衣服,做饭,生孩子,都在一个对象里面,但是随着科技的发展,有了洗衣机和电饭煲,所以洗衣做饭的功能已经不再是家庭主妇需要自己亲手去做的,所以应该创建出三个对象,家庭主妇生孩子,洗衣机洗衣服,电饭煲做饭。这里就是每个对象执行的任务就很明确,如果一个功能有变动,不会影响其他的功能。

2.开闭原则(Open-Closed Principle, OCP):

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

什么叫对扩展开,对修改关闭呢,就是我要添加一个功能,只需要在原来的基础上进行扩展,增加新的类即可,而不用修改原有的代码。还是举个例子,作为一个程序员,我感觉显示器太小了,不够用,那怎么办,在加一个显示器,接上线,就可以啦,我不需要把原来的屏幕拆掉,然后又重新做一个我想要的类型的屏幕。这个模式在抽象工厂模式中会详细描述。

3.里氏代换原则(Liskov Substitution Principle, LSP):

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

简单的来理解,你就可以理解为,父类引用指向子类对象,在调用的时候,以父类对象来调用,所以父类的所有方法,都在子类中要实现,子类的方法如果在父类中没有,则不能在父类中调用,属于子类独有方法,这里就不符合里氏代换原则。通常上,父类都是接口或者抽象类,子类实现或者继承父类,有不同的要求,再重新写一个子类继承父类或者实现父类方法即可。这里也是符合开闭原则的。

里氏代换原则是实现开闭原则的重要方式之一。在传递参数时使用基类对象,在定义成员变量、定义局部变量、确定方法返回类型时都可使用里氏代换原则。针对基类编程,在程序运行时再确定具体子类。

4.依赖倒转原则(Dependency Inversion  Principle, DIP):

抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

我们直接举个例子,还是洗衣服吧,衣服肯定是要洗的,可以手洗,可以洗衣机洗,洗衣机有桶式的和轮式的,还有干洗,你不能换一个洗衣服的方式,就去修改一下洗衣服的类,这样太麻烦了,所以我们抽象一个洗衣服的接口出来,里面有一个洗衣服的方法,但是具体怎么洗,就创建不同的子类来实现这个接口中洗衣服的方法。在要洗衣服的地方,我们直接调用接口中的洗衣服的方法,根据传入的不用的子类,就有不同的实现。

这里就不得不说一下依赖注入,依赖注入有三种方式:构造注入,setter注入,接口注入。构造注入是在创建对象的时候,传入需要注入的类;setter既是用set方法设置进去;接口注入,是在业务中传入一个对象,通常定义为抽象类,就是我们说的接口回调,设置时间监听就是这种方式。

在大多数情况下,开闭原则、里氏代换原则和依赖倒转原则,这三个设计原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段,它们相辅相成,相互补充,目标一致,只是分析问题时所站角度不同而已。

5.接口隔离原则(Interface  Segregation Principle, ISP):

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

这里跟单一职责有点像,但是这里没有具体的实现,每一个接口,都只关心自己本身的功能,将功能划分开,就有不同的接口,不同的接口具备不同的职责。我们还是举个例子:人类的延续需要生孩子,但是生孩子就必须有男性和女性,我们有一个人的接口,里面就有生孩子和结婚的抽象方法,女人和男人都来实现这个接口,但是男人不能生孩子,所以就只能在这里做一个空实现,这就不符合接口隔离原则。我们因该直接抽象出来两个接口,男人和女人,根据不同要求,来实现这些接口,女人中有生孩子和结婚的抽象方法,男人中有结婚和养家的抽象方法,其实还可以抽取一个父类接口,将结婚放到父类中,男人和女人继承这个接口。所以在设计的时候,要尽量将不同的功能区分开来。

6.迪米特法则(Law of  Demeter, LoD):

一个软件实体应当尽可能少地与其他实体发生相互作用。

每个对象都有自己的直接关联对象,自己本身this,成员变量,参数传入的变量,集合中的对象,自己创建的对象,当不是与直接对象交互时,就应该符合迪米特原则。我们创建一个中介,让中介来相互控制协调,以后讲的适配器模式就是典型的例子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值